簡體   English   中英

docker-compose 文件之間的共享卷

[英]Shared volume between docker-compose files

我想在 2 個 docker-compose 文件之間共享一個卷。 有 2 個相互關聯的應用程序,我需要在它們之間創建一個符號鏈接。 我嘗試使用命名卷和外部功能。

在第一個容器上,我可以看到 /var/www/s1 文件夾的內容,但 /var/www/s2 文件夾是空的,而在第二個容器上,我可以看到 /var/www/s2 文件夾的內容文件夾,但 /var/www/s1 文件夾似乎是空的。 由於我無法在 /var/www 中看到其他應用程序創建的文件夾的內容,因此我無法進行符號鏈接。

我制作了一些虛擬的 docker-compose 文件,以嘗試以更簡單的方式暴露問題。

在/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

第二個 docker-compose 文件如下所示:

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 ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                              NAMES
80b83a60a0e5        php                   "docker-php-entrypoi…"   2 seconds ago       Up 1 second                                            php
05addf1fc24e        nginx                 "/docker-entrypoint.…"   9 seconds ago       Up 8 seconds        80/tcp                             nginx
8c596d21cf7b        portainer/portainer   "/portainer"             2 hours ago         Up About a minute   9000/tcp, 0.0.0.0:9001->9001/tcp   portainer

$ docker exec -it 05addf1fc24e sh
# cd /var/www
# ls
s1  s2
# cd s1
# ls
docker  magazine.txt
# cd ..
# cd s2
# ls
# exit
$ docker exec -it 80b83a60a0e5 sh
# cd /var/www
# ls
s1  s2
# cd s1
# ls
# cd ..
# cd s2
# ls
docker  paper.txt
# exit

在機械層面上,卷和綁定坐騎不會按照您建議的方式“嵌套”。 命名卷shared-s最終將包含空目錄s1s2 ,但不包含來自任一主機目錄的任何內容。

發生的事情是這樣的:

  1. Docker 首先啟動(比如說) nginx容器。 它對volumes:排序volumes:從最短到最長安裝在該容器上。
  2. 由於shared-s卷為空,所以將/var/www nginx基礎鏡像的內容復制到該卷中; 然后將卷安裝在容器中的/var/www上。
  3. Docker 創建掛載點/var/www/s1 (在卷中),然后在那里綁定掛載主機目錄(根本不修改卷)。
  4. Docker 啟動php容器並對它的volumes:排序volumes:
  5. 由於shared-s卷不是空的,Docker 只是將它掛載到容器中,隱藏圖像中/var/www中可能存在的任何內容。
  6. Docker 創建掛載點/var/www/s2 (在卷中),然后在那里綁定掛載主機目錄(根本不修改卷)。

你會注意到這個序列有幾個問題。 其他已安裝卷的內容永遠不會被復制到“共享”卷中,這會破壞您在此處嘗試的文件共享。 無論哪個容器首先啟動,將其映像中的內容復制到共享卷中,而另一個容器中該映像中的任何內容都會丟失。 就此而言,如果基礎鏡像中有更新,Docker 將忽略它,以支持共享卷中的(舊)內容。

我建議完全避免使用卷。 為每個容器構建一個單獨的映像,將您的應用程序代碼COPY到其中。 如果您可以在后端應用程序中使用靜態文件服務器,那將比嘗試將文件從一個容器復制到另一個容器要容易得多。 如果這是不可避免的,您可以使用通常用於多階段構建的COPY --from=image語法也將內容從一個構建的圖像復制到另一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM