gpt4 book ai didi

docker - 如何挂载在 docker 镜像构建期间创建的目录?

转载 作者:行者123 更新时间:2023-12-02 18:26:29 25 4
gpt4 key购买 nike

我的 docker-compose 文件如下:

version: "3"

services:
db:
image: postgres
environment:
POSTGRES_PASSWORD: qwerty
POSTGRES_USER: qwerty
volumes:
- /data/db:/var/lib/postgresql/data

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

在我的 dockerfile_backend我有一个 git clone 语句,它从 git repo 克隆项目。有一个名为 configs 的文件夹它是 git clone 的一部分。我需要将此文件夹挂载为卷(类似于 postgres 卷挂载点)。安装 configs是必要的,因为在运行时文件夹的内容会被修改或更新,这些更改不应丢失。

如何挂载镜像构建创建的文件夹?

我尝试在 backend 下添加如下卷服务 :
    volumes:
- /data/configs:/git_folder/configs

这里的问题是挂载点( /data/configs )最初是空的,所以图像文件夹( /git_folder/configs )也变空了。

最佳答案

How can i mount the folder that image build creates?



最直接的方法是完全避免这条路径:运行 git clone来自主机的命令。从构建的镜像中复制数据并不容易,如果构建过程的一个重要部分是将内容上传到主机,您无法从 Dockerfile 中完成所有操作。

如果您正在处理的数据实际上是配置数据(顾名思义),则使用 docker-compose.yml 将文件 checkin (副本)到存储库中。文件是一种合理的方法。如果您也控制该存储库,您通常会将这些文件包含在应用程序存储库本身中。然后你可以正常绑定(bind)挂载目录:

backend:
build: .
ports:
- "4000:4000"
volumes:
- ./configs:/git_folder/configs

如果是应用程序数据,您可以将其存储在命名卷中。您将无法从主机直接访问它。 Docker 将使用镜像中的内容填充卷,但仅在您第一次运行容器时:如果您更改镜像,卷将保持不变。

version: '3'
volumes:
configs:
services:
backend:
build: .
ports:
- "4000:4000"
volumes:
- configs:/git_folder/configs

第三种方法是让容器的启动检测数据目录是否为空,如果是,则填充它。你提到了 postgres以图像为例,这就是该图像的作用(如果已知文件不存在,则运行 PostgreSQL 的 initdb 命令)。您可以编写如下脚本:
#!/bin/sh
# Create the `configs` directory if it's empty
if [ -f /git_folder/configs/some_file ]; then
cp -a /git_folder/configs_base/* /git_folder/configs
fi
# Run the main container command
exec "$@"

在您的 Dockerfile 中,将此脚本设为 ENTRYPOINT .您必须使用 JSON 数组语法调用它。不要覆盖 entrypoint:docker-compose.yml (尤其是不会改变 command: 的普通 shell 命令含义的东西)。
COPY entrypoint.sh /git_folder
RUN chmod +x /git_folder/entrypoint.sh
ENTRYPOINT ["/git_folder/entrypoint.sh"]
CMD python manage.py runserver

关于docker - 如何挂载在 docker 镜像构建期间创建的目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62011412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com