我有一个这样的回购设置:
/config
config.json
/worker-a
Dockerfile
<symlink to config.json>
/code
/worker-b
Dockerfile
<symlink to config.json>
/code
但是,构建映像失败,因为 Docker 无法处理符号链接。我应该提到我的项目远比这复杂,所以重组目录不是一个好的选择。我该如何处理这种情况?
原文由 Chris B. 发布,翻译遵循 CC BY-SA 4.0 许可协议
Docker 不支持在构建上下文之外对文件进行符号链接。
以下是在容器中使用共享文件的一些不同方法:
构建时间
从配置映像复制(Docker buildkit)
最新版本的 Docker 允许
RUN
使用 绑定 命名映像或先前构建阶段的安装的--mount=type=bind,target=/dir,source=/dir,from=image-or-stage-name
为包含共享配置/文件的基础
me/worker-config
映像创建一个Dockerfile
。构建并标记配置映像
me/worker-config
在实际构建期间安装
me/worker-config
映像共享基础映像
为包含共享配置/文件的基础
me/worker-config
映像创建一个Dockerfile
。构建并标记图像
me/worker-config
获取基础
me/worker-config
您所有工人的图像Dockerfile
s构建脚本
使用脚本将公共配置推送到每个工作容器。
./build worker-n
从 URL 构建
从所有
worker-n
构建的公共 URL 中提取配置。增加镜像构建上下文的范围
通过从包含共享文件和特定容器文件的父目录构建,将符号链接目标文件包含在构建上下文中。
您在
Dockerfile
中引用的所有源路径也必须更改以匹配新的构建上下文:变成
如果您有一个大型构建上下文,则使用此方法可以使 所有 构建上下文变大,因为它们都是共享的。它会减慢构建速度,尤其是对于远程 Docker 构建服务器。请注意,仅引用 了构建上下文基础中的
.dockerignore
文件。可以挂载卷的替代构建
其他争取 Dockerfile 兼容性的项目可能在构建时支持卷。例如
podman build
/ buildah 支持--volume
选项 将挂载文件从主机绑定到构建容器中。然后构建可以引用挂载的卷
运行
从命名卷挂载配置目录
像这样的卷只能用作目录,因此您不能像在将文件从主机挂载到容器时那样指定文件。
从数据容器挂载配置目录
同样,目录只是因为它与上面的基本相同。不过,这会自动将文件从目标目录复制到新创建的共享卷中。
在运行时从主机挂载配置文件