![](/img/trans.png)
[英]docker unable to mount host directory to docker container with docker-compose
[英]docker-compose only mount files that exist on host to container
是否可以將主機目錄掛載到容器中,但只允許覆蓋主機上存在的文件?
示例 github 倉庫: https : //github.com/UniBen/stackoverflow-59031249
例如主機:
src/
public/
index.php (200kb)
容器:
src/
public/
index.php (100kb)
vendor/
...
期望的輸出:(容器文件系統與存在的掛載主機系統文件合並。注意 index.php 文件的大小。)
src/
public/
index.php (200kb)
vendor/
...
實際輸出:
src/
public/
index.php (200kb)
示例 docker-compose.yml
version: '3.2'
services:
php:
image: php
volumes:
- ./src:/src
編輯:所以看起來由 docker 實現的 overlayfs 僅用於構建 docker 圖像,而不能用於卷。 我仍然認為可以指定自定義驅動程序,但不確定如何指定。 作為臨時修復,我做了一些花哨的東西,將容器中的東西映射出來,對其進行區分並將其放回原處,但並不理想。
是否可以將主機目錄掛載到容器中,但是...
不。唯一的 Docker 安裝選項是直接“用主機中的等效目錄替換容器中的此目錄”。 沒有辦法修改它,有選擇地隱藏子目錄,或者實現你的“只有它已經存在”的規則。
在您展示的示例中,您可能根本不需要卷。 像index.php
和vendor
目錄這樣的文件是應用程序源代碼,在典型的使用中,你會寫一個 Dockerfile, COPY index.php .
將文件移動到圖像中,然后RUN composer ...
創建供應商樹。 這將與您的主機環境隔離,因此映像中的vendor
目錄將與主機系統上存在的任何內容分開。
實際上,沒有選項可以控制這種行為,例如,如何處理源和目標之間的數據。 但如果大衛的回答不是你的情況,你可以做這樣的事情:
version: '3.2'
services:
example:
build:
context: .
volumes:
- data:/src
- ./src:/src/host
volumes:
data:
docker 文檔如何說:
如果您啟動一個創建新卷的容器,並且該容器在要掛載的目錄中有文件或目錄,則該目錄的內容將被復制到該卷中。
所以在那之后,讓我們稍微調查一下:
/src # ls
file.a.txt file.c.txt host
/src # cat host/file.a.txt
host
/src # cat file.a.txt
container
/src # cat file.c.txt
container
來自容器的data
保存到名為 volume 的data
。 來自主機的數據位於主機文件夾中。 現在,您可以使用cp
或rsync
使用您想要的任何規則從主機文件夾復制到src
。
這是一個相當可疑和人為的例子,也許重新考慮當前的實現是個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.