![](/img/trans.png)
[英]Docker-compose shared volume between containers but that has a path in host
[英]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
最終將僅包含空目錄s1
和s2
,但不包含來自任一主機目錄的任何內容。
發生的事情是這樣的:
nginx
容器。 它對volumes:
排序volumes:
從最短到最長安裝在該容器上。shared-s
卷為空,所以將/var/www
nginx
基礎鏡像的內容復制到該卷中; 然后將卷安裝在容器中的/var/www
上。/var/www/s1
(在卷中),然后在那里綁定掛載主機目錄(根本不修改卷)。php
容器並對它的volumes:
排序volumes:
shared-s
卷不是空的,Docker 只是將它掛載到容器中,隱藏圖像中/var/www
中可能存在的任何內容。/var/www/s2
(在卷中),然后在那里綁定掛載主機目錄(根本不修改卷)。你會注意到這個序列有幾個問題。 其他已安裝卷的內容永遠不會被復制到“共享”卷中,這會破壞您在此處嘗試的文件共享。 無論哪個容器首先啟動,將其映像中的內容復制到共享卷中,而另一個容器中該映像中的任何內容都會丟失。 就此而言,如果基礎鏡像中有更新,Docker 將忽略它,以支持共享卷中的(舊)內容。
我建議完全避免使用卷。 為每個容器構建一個單獨的映像,將您的應用程序代碼COPY
到其中。 如果您可以在后端應用程序中使用靜態文件服務器,那將比嘗試將文件從一個容器復制到另一個容器要容易得多。 如果這是不可避免的,您可以使用通常用於多階段構建的COPY --from=image
語法也將內容從一個構建的圖像復制到另一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.