现在我有一些容器用于 web 应用程序 (包括 nginx、gunicorn、postgres 和 node 用于从源文件构建静态文件和 React 服务器端渲染)。在一个用于 node 容器的 Dockerfile 中,我有两个步骤:构建和运行 (Dockerfile.node)。它最终会在容器中生成两个目录:bundle_client
- 是 nginx 的静态文件,bundle_server
- 在 node 容器内部用于启动 express 服务器。
然后,我需要将已构建的静态文件夹 (bundle_client
) 与 nginx 容器共享。根据 docker-compose 参考,在我的 docker-compose.yml
文件中,我有以下服务(完整内容请参见docker-compose.yml):
node:
volumes:
- vnode:/usr/src
nginx:
volumes:
- vnode:/var/www/tg/static
depends_on:
- node
并且卷:
volumes:
vnode:
运行docker-compose build
没有错误。 运行docker-compose up
一切正常,我可以打开localhost:80
,这里有nginx,gunicorn和node express SSR全部工作良好,我可以看到一个网页,但是所有静态文件都返回404未找到错误。
如果使用docker volume ls
检查卷,我可以看到两个新创建的卷,分别命名为tg_vnode
(在此处考虑)和tg_vdata
(请参见完整的docker-compose.yml)
如果我使用docker run -ti -v /tmp:/tmp tg_node /bin/bash
进入nginx容器,我无法看到映射我的静态文件的www/tg/static
文件夹。 此外,我尝试使用nginx容器Dockerfile.nginx
创建一个空的/var/www/tg/static
文件夹,但它保持为空。
如果我将主机机器上的bundle_client
文件夹映射到docker-compose.yml
中的nginx.volumes
部分中,如- ./client/bundle_client:/var/www/tg/static
,则它可以正常工作,并且我可以在浏览器中看到所有已提供给nginx的静态文件。
我做错了什么以及如何使我的容器与nginx容器共享构建的静态内容?
PS:我阅读了所有文档,所有GitHub问题和stackoverflow Q&As,并且我理解它应该起作用,没有信息可以告诉我它不起作用时该怎么办。
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"
}
]
文件: Dockerfile.node, docker-compose.yml
Nginx dockerfile: Dockerfile.nginx
更新:我创建了一个简化的存储库以重现问题:repo
(在npm install
上有一些警告,请不要担心它可以正常安装和构建)。最终当我们打开localhost:80
时,我们会看到一个空白页面和Chrome开发工具中静态文件(vendor.js
和app.js
)的404信息,但是应该有一个由React脚本生成的消息React app: static loaded
。
nocopy
选项。我在您的compose文件中看到您已经在多个地方使用了它,只有一个地方会将其内容放入卷中并获胜。如果构建发生在挂载之后,则会在运行时放置文件。很难想象您的compose文件,但请看看这些提示是否有所帮助。 - Tarun Lalwanidocker-volume
标签呢?非常感谢。 - Alejandro Galera