如何将文件夹挂载为 docker image build 创建的卷?

rak*_*ian 5 docker dockerfile docker-compose docker-volume persistent-volumes

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"
Run Code Online (Sandbox Code Playgroud)

docker 构建会创建一个文件夹,/docker_container/configs其中包含config.json和 等文件db.sqlite3。将此文件夹安装为卷是必要的,因为在运行时文件夹的内容会被修改或更新,这些更改不应丢失。

我尝试添加卷如下:

    volumes:
      - /host_path/configs:/docker_container/configs
Run Code Online (Sandbox Code Playgroud)

这里的问题是主机路径(/host_path/configs)的挂载点最初是空的,因此容器映像文件夹(/docker_container/configs)也变空了。这个问题怎么解决呢?

Sha*_*k V 1

您可以通过将图像中的内容复制到目录来预先填充主机目录。

 docker run --rm backend:dev1.0.0 tar -cC /docker_container/config/ . | tar -xC /host_path/configs
Run Code Online (Sandbox Code Playgroud)

然后按原样启动您的撰写项目,并且主机路径已经具有图像中的原始内容。


另一种方法是使用入口点脚本将内容复制到已安装的卷。

您可以将主机路径安装到不同的路径(例如/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
Run Code Online (Sandbox Code Playgroud)