簡體   English   中英

如何將文件夾安裝為 docker 映像構建創建的卷?

[英]How to mount the folder as volume that docker image build creates?

docker-compose文件如下:

version: "3"

services:
  backend:
    build:
      context: .
      dockerfile: dockerfile_backend
    image: backend:dev1.0.0
    entrypoint: ["sh", "-c"]
    command: python manage.py runserver
    ports:
      - "4000:4000"

docker 構建創建一個文件夾,比如說/docker_container/configs ,其中包含config.jsondb.sqlite3等文件。 必須將此文件夾安裝為卷,因為在運行時文件夾的內容會被修改或更新,這些更改不應丟失。

我嘗試按如下方式添加卷:

    volumes:
      - /host_path/configs:/docker_container/configs

這里的問題是主機路徑( /host_path/configs )的掛載點最初是空的,因此容器映像文件夾( /docker_container/configs )也為空。 這個問題怎么解決?。

您正在使用綁定掛載,它將“隱藏”您描述的圖像中已經存在的內容 - /host_path/configs為空, /docker_container/configs也將為空。

您可以改用命名卷,它會自動使用映像中已存在的內容填充卷,並允許您按照描述執行更新:

services:
  backend:
    # ...
    #
    # content of /docker_container/configs from the image
    # will be copied into backend-volume
    # and accessible at runtime
    volumes:
    - backend-volume:/docker_container/configs

volumes:
  backend-volume:

卷文檔中所述

如果您啟動一個創建新卷的容器 [...] 並且容器在要掛載的目錄中有文件或目錄 [...] 目錄的內容將被復制到卷中

您可以通過將內容從圖像復制到目錄來預先填充主機目錄。

 docker run --rm backend:dev1.0.0 tar -cC /docker_container/config/ . | tar -xC /host_path/configs

然后按原樣啟動您的撰寫項目,並且主機路徑已經包含圖像中的原始內容。


另一種方法是使用入口點腳本將內容復制到已安裝的卷。

您可以將主機路徑掛載到不同的路徑(例如/docker_container/config_from_host ),並有一個入口點腳本,如果目錄為空,則該腳本將/docker_container/configs中的內容復制到/docker_container/config_from_host中。

示例偽代碼:

$ cat Dockerfile
  RUN cp entrypoint.sh /entrypoint.sh
  CMD /entrypoint.sh

$ cat entrypoint.sh:
   #!/bin/bash
   if /docker_container/config_from_host is empty; then
        cp -r /docker_container/config/* /docker_container/config_from_host
   fi
   python manage.py runserver

暫無
暫無

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

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