我现在有一些用于 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:80
nginx、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
由反应脚本生成。