[英]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.json
和db.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.