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

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.ymlnginx.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.jsapp.js)消息,但应该有一个React app: static loaded反应脚本生成的消息.

Tar*_*ani 9

您需要进行两项更改.在你的节点服务广告中,音量就像

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)

您可以在我的测试中看到容器有文件

Nginx有文件