Max*_*Max 8 docker docker-compose docker-volume
我现在有一些Web应用程序的容器(nginx,gunicorn,postgres和节点从源代码构建静态文件和React服务器端呈现).在节点容器的Dockerfile中,我有两个步骤:构建和运行(Dockerfile.node).它最终在容器内有两个目录:bundle_client
- 是nginx的静态和bundle_server
- 它在节点容器本身用于启动快速服务器.
然后我需要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
Run Code Online (Sandbox Code Playgroud)
和数量:
volumes:
vnode:
Run Code Online (Sandbox Code Playgroud)
运行docker-compose build
完成且没有错误.运行docker-compose up
运行每一个好,我可以打开localhost:80
,有nginx,gunicorn和节点表达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
主机上的文件夹,因为它工作正常,我可以在浏览器中看到所有静态文件与nginx一起提供.docker-compose.yml
nginx.volumes
- ./client/bundle_client:/var/www/tg/static
我做错了什么以及如何让我的容器与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"
}
]
Run Code Online (Sandbox Code Playgroud)
文件: Dockerfile.node, docker-compose.yml
Nginx dockerfile:Dockerfile.nginx
UPD:我创建了一个简化的repo来重现一个问题:repo
(有一些警告,npm install
因为它安装并构建好了).最后,当我们打开时,我们会在Chrome开发工具中localhost:80
看到一个空页面和404个静态文件(vendor.js
和app.js
)消息,但应该有一个React app: static loaded
反应脚本生成的消息.
您需要进行两项更改.在你的节点服务广告中,音量就像
volumes:
- vnode:/usr/src/bundle_client
Run Code Online (Sandbox Code Playgroud)
由于你想分享/usr/src/bundle_client
你不应该使用,/usr/src/
因为它也将共享整个文件夹和结构.
然后在你的nginx服务中添加如下的卷
volumes:
- type: volume
source: vnode
target: /var/www/test/static
volume:
nocopy: true
Run Code Online (Sandbox Code Playgroud)
该nocopy: true
让我们的意图明显,容器的初始地图上的映射文件夹的内容不应被复制.默认情况下,要映射到卷的第一个容器将获取映射文件夹的内容.在您的情况下,您希望这是node
容器.
在测试之前,请确保运行以下命令以终止缓存的卷
docker-compose down -v
Run Code Online (Sandbox Code Playgroud)
您可以在我的测试中看到容器有文件
归档时间: |
|
查看次数: |
3682 次 |
最近记录: |