Docker - 无法在卷内的容器之间共享数据(docker-compose 3)

2024-01-01

我现在有一些用于 Web 应用程序的容器(nginx、gunicorn、postgres 和节点,用于从源代码构建静态文件和 React 服务器端渲染)。在节点容器的 Dockerfile 中,我有两个步骤:构建和运行(Dockerfile.node https://www.dropbox.com/s/f2l4f1rzhuxat7d/Dockerfile.node?dl=0)。它最终在容器内有两个目录:bundle_client- 是 nginx 的静态并且bundle_server- 它在节点容器本身中用于启动 Express 服务器。

然后我需要共享一个构建的静态文件夹(bundle_client)与 nginx 容器。根据我的 docker-compose 参考来执行此操作docker-compose.yml我有以下服务(查看完整内容docker-compose.yml https://www.dropbox.com/s/aq8n8bug9jbhhwq/docker-compose.yml?dl=0):

node:
  volumes:
    - vnode:/usr/src

nginx:
  volumes:
    - vnode:/var/www/tg/static
  depends_on:
    - node

和卷:

volumes:
  vnode:

Running docker-compose build完成且没有错误。跑步docker-compose up运行一切正常,我可以打开localhost:80nginx、gunicorn 和 Node Express SSR 都工作得很好,我可以看到一个网页,但所有静态文件都返回 404 未找到错误。

如果我检查卷docker volume ls我可以看到两个新创建的卷,名为tg_vnode(我们在这里考虑)和tg_vdata(参见完整的 docker-compose.yml)

如果我进入 nginx 容器docker run -ti -v /tmp:/tmp tg_node /bin/bash我看不到我的www/tg/static应该从节点卷映射我的静态文件的文件夹。我还尝试创建一个空的/var/www/tg/static包含 nginx 容器的文件夹Dockerfile.nginx但它仍然是空的。

如果我映射一个bundle_client主机中的文件夹docker-compose.yml in a nginx.volumes节为- ./client/bundle_client:/var/www/tg/static它工作正常,我可以在浏览器中看到 nginx 提供的所有静态文件。

我做错了什么以及如何使我的容器与 nginx 容器共享构建的静态内容?

PS:我阅读了所有文档、所有 github 问题和 stackoverflow 问答,据我所知,它必须起作用,并且没有任何信息说明当不起作用时该怎么做。

UPD:的结果docker volume inspect vnode:

[
{
    "CreatedAt": "2018-05-18T12:24:38Z",
    "Driver": "local",
    "Labels": {
        "com.docker.compose.project": "tg",
        "com.docker.compose.version": "1.21.1",
        "com.docker.compose.volume": "vnode"
    },
    "Mountpoint": "/var/lib/docker/volumes/tg_vnode/_data",
    "Name": "tg_vnode",
    "Options": null,
    "Scope": "local"
}
]

Files: Dockerfile.node https://www.dropbox.com/s/f2l4f1rzhuxat7d/Dockerfile.node?dl=0, docker-compose.yml https://www.dropbox.com/s/aq8n8bug9jbhhwq/docker-compose.yml?dl=0

Nginx docker 文件:Dockerfile.nginx https://www.dropbox.com/s/i5da41f4ejm0fya/Dockerfile.nginx?dl=0


UPD:我创建了一个简化的存储库来重现问题:repo https://bitbucket.org/vashchukmaksim/docker-share-volume-test/src/master/(有一些警告npm install没关系,它安装和构建都可以)。最终当我们打开时localhost:80我们看到一个空页面和静态文件的 404 消息(vendor.js and app.js)在 Chrome 开发工具中,但应该有一条消息React app: static loaded由反应脚本生成。


您需要进行两项更改。在您的节点服务中添加卷,如下所示:

volumes:
  - vnode:/usr/src/bundle_client

既然你想分享/usr/src/bundle_client你不应该使用/usr/src/因为这也将共享完整的文件夹和结构。

然后在您的 nginx 服务中添加如下卷:

volumes:
  - type: volume
    source: vnode
    target: /var/www/test/static
    volume:
      nocopy: true

The nocopy: true让我们的意图明确,在容器的初始映射上,不应复制映射文件夹的内容。默认情况下,映射到卷的第一个容器将获取映射文件夹的内容。在你的情况下,你希望这是node容器。

另外,在测试之前,请确保运行以下命令来终止缓存的卷:

docker-compose down -v

您可以在我的测试过程中看到容器包含以下文件:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker - 无法在卷内的容器之间共享数据(docker-compose 3) 的相关文章

随机推荐