簡體   English   中英

將卷安裝到 docker 容器中

[英]mounting volume into docker container

我如何將主機的路徑安裝到容器中而不覆蓋同一安裝路徑中已經存在的包含。

使困惑? 讓我舉個例子吧:

使用 WORKDIR 作為/app構建一個 docker 圖像,並使用文件/app/config1烘焙它。 現在,我將在主機 ~/ 的運行時添加幾個配置文件,並希望這些文件位於相同的/app路徑中的容器中

當我執行docker run -v ~/:/app example它似乎正在刪除烘焙的config1文件

有關如何解決此用例的任何指示? 當然,除了安裝在不同的路徑。

蒂亞!

Docker 正在實施 Linux 掛載系統調用來執行綁定掛載,並且它始終隱藏底層文件系統,就像 Linux 中的大多數其他掛載命令一樣,沒有標志或選項來更改 Linux 的行為。 覆蓋文件系統會將多個目錄合並在一起,但您不能將覆蓋文件系統指向覆蓋文件系統的源,所以這已經結束了。 這留下了我能想到的兩種選擇。

當映像文件系統的內容為空時,docker 中的命名卷將被初始化,因此如果您不擔心使用舊卷中的配置使用新配置文件重建映像,您可以改用它們。 如果您需要將該卷掛載回主機路徑,您可以將標志傳遞給本地卷驅動程序以掛載與 docker 使用的默認命名卷路徑不同的主機路徑。 根據您運行容器的方式,可以采用三種不同的方法來做到這一點:

  # create the volume in advance
  $ docker volume create --driver local \
      --opt type=none \
      --opt device=/home/user/test \
      --opt o=bind \
      test_vol

  # create on the fly with --mount
  $ docker run -it --rm \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \
    foo

  # inside a docker-compose file
  ...
  volumes:
    bind-test:
      driver: local
      driver_opts:
        type: none
        o: bind
        device: /home/user/test
  ...

否則,您可以將圖像修改為入口點,以在圖像構建期間將配置文件保存到緩存位置,然后在容器在入口點啟動時將它們復制回目標目錄。 我在我的基本圖像腳本中有一個例子。 這比綁定掛載的命名卷具有優勢,因為無論卷如何掛載,它都可以工作,並且可以更新已經有內容的現有卷。

從主機綁定掛載目錄將覆蓋該文件夾的內容。 如果您只需要掛載幾個配置文件,您可以為每個文件單獨綁定掛載,例如-v ~/config2:/app/config2

另一種方法是將目錄掛載到不同的位置,並向容器添加用於從多個位置收集配置文件的邏輯。

暫無
暫無

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

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