簡體   English   中英

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.phpvendor目錄這樣的文件是應用程序源代碼,在典型的使用中,你會寫一個 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 來自主機的數據位於主機文件夾中。 現在,您可以使用cprsync使用您想要的任何規則從主機文件夾復制到src

這是一個相當可疑和人為的例子,也許重新考慮當前的實現是個好主意。

暫無
暫無

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

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