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
这里的问题是hostpath(/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