Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
docker compose文件之间的共享卷_Docker_Docker Compose_Volumes - Fatal编程技术网

docker compose文件之间的共享卷

docker compose文件之间的共享卷,docker,docker-compose,volumes,Docker,Docker Compose,Volumes,我想在两个docker compose文件之间共享一个卷。有两个相互连接的应用程序,我需要在它们之间创建一个符号链接。 我尝试使用命名卷和外部功能 在第一个容器上,我可以看到/var/www/s1文件夹的内容,但是/var/www/s2文件夹是空的,而在第二个容器上,我可以看到/var/www/s2文件夹的内容,但是/var/www/s1文件夹似乎是空的。由于在/var/www中看不到其他应用程序创建的文件夹的内容,因此无法进行符号链接 我制作了一些虚拟docker组合文件,试图以更简单的方式暴

我想在两个docker compose文件之间共享一个卷。有两个相互连接的应用程序,我需要在它们之间创建一个符号链接。 我尝试使用命名卷和外部功能

在第一个容器上,我可以看到/var/www/s1文件夹的内容,但是/var/www/s2文件夹是空的,而在第二个容器上,我可以看到/var/www/s2文件夹的内容,但是/var/www/s1文件夹似乎是空的。由于在/var/www中看不到其他应用程序创建的文件夹的内容,因此无法进行符号链接

我制作了一些虚拟docker组合文件,试图以更简单的方式暴露问题

在/var/www/s1中应该有一个“magazine.txt”文件,而在/var/www/s2中应该有一个“paper.txt”文件

第一个docker compose文件如下所示:

services:
  nginx:
    image: nginx
    container_name: nginx
    volumes:
      - ../:/var/www/s1
      - shared-s:/var/www
volumes:
  shared-s:
    name: shared-s
version: '3.8'
services:
  php:
    image: php
    container_name: php
    command: tail -F /var/www/s2/paper.txt
    volumes:
      - ../:/var/www/s2
      - shared-s:/var/www
volumes:
  shared-s:
    external:
      name: shared-s
第二个docker compose文件如下所示:

services:
  nginx:
    image: nginx
    container_name: nginx
    volumes:
      - ../:/var/www/s1
      - shared-s:/var/www
volumes:
  shared-s:
    name: shared-s
version: '3.8'
services:
  php:
    image: php
    container_name: php
    command: tail -F /var/www/s2/paper.txt
    volumes:
      - ../:/var/www/s2
      - shared-s:/var/www
volumes:
  shared-s:
    external:
      name: shared-s

在机械层面上,卷和绑定挂载不会按照您建议的方式“嵌套”。命名的卷
shared-s
将只包含空目录
s1
s2
,但不包含任何主机目录中的内容

发生的事情是这样的:

services:
  nginx:
    image: nginx
    container_name: nginx
    volumes:
      - ../:/var/www/s1
      - shared-s:/var/www
volumes:
  shared-s:
    name: shared-s
version: '3.8'
services:
  php:
    image: php
    container_name: php
    command: tail -F /var/www/s2/paper.txt
    volumes:
      - ../:/var/www/s2
      - shared-s:/var/www
volumes:
  shared-s:
    external:
      name: shared-s
  • Docker首先启动(比如)nginx容器。它将
    卷排序:
    装载在该容器上,从最短到最长
  • 由于
    shared-s
    卷为空,因此
    /var/www
    中的
    nginx
    基本图像的内容被复制到卷中;然后将卷装入容器中的
    /var/www
  • Docker创建装载点
    /var/www/s1
    (在卷中),然后绑定在那里装载主机目录(根本不修改卷)
  • Docker启动
    php
    容器并对其
    卷进行排序:
  • 由于
    shared-s
    卷不是空的,Docker只是将其装载到容器中,隐藏图像中
    /var/www
    中可能存在的任何内容
  • Docker创建装载点
    /var/www/s2
    (在卷中),然后绑定在那里装载主机目录(根本不修改卷)
  • 你会注意到这个序列有几个问题。其他已装入卷的内容永远不会复制到“共享”卷中,这会破坏您在此处尝试的文件共享。无论哪个容器首先启动,都会将内容从其映像复制到共享卷中,而另一个容器中该映像中的任何内容都会丢失。因此,如果基础映像中有更新,Docker将忽略该更新,而选择共享卷中的(旧)内容

    我建议在这里完全避免使用音量。为每个容器构建一个单独的映像,
    将应用程序代码复制到其中。如果您可以在后端应用程序中使用静态文件服务器,这将比尝试将文件从一个容器复制到另一个容器容易得多。如果无法避免,您可以使用通常用于多阶段构建的语法,将内容从一个构建图像复制到另一个构建图像