如何将文件夹挂载为 docker 映像构建创建的卷?



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

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

相关内容

  • 没有找到相关文章

最新更新