Docker 和符号链接

新手上路,请多包涵

我有一个这样的回购设置:

 /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 许可协议

阅读 761
1 个回答

Docker 不支持在构建上下文之外对文件进行符号链接

以下是在容器中使用共享文件的一些不同方法:


构建时间

从配置映像复制(Docker buildkit)

最新版本的 Docker 允许 RUN 使用 绑定 命名映像或先前构建阶段的安装的 --mount=type=bind,target=/dir,source=/dir,from=image-or-stage-name

为包含共享配置/文件的基础 me/worker-config 映像创建一个 Dockerfile

 FROM scratch
COPY config.json /config.json

构建并标记配置映像 me/worker-config

 docker build -t me/worker-config:latest .

在实际构建期间安装 me/worker-config 映像

RUN --mount=type=bind,target=/worker-config,source=/,from=me/worker-config:latest \
    cp /worker-config/config.json /app/config.json;

共享基础映像

为包含共享配置/文件的基础 me/worker-config 映像创建一个 Dockerfile

 COPY config.json /config.json

构建并标记图像 me/worker-config

 docker build -t me/worker-config:latest .

获取基础 me/worker-config 您所有工人的图像 Dockerfile s

 FROM me/worker-config:latest

构建脚本

使用脚本将公共配置推送到每个工作容器。

./build worker-n

 #!/bin/sh
set -uex
rundir=$(readlink -f "${0%/*}")
container=$(shift)
cd "$rundir/$container"
cp ../config/config.json ./config-docker.json
docker build "$@" .

从 URL 构建

从所有 worker-n 构建的公共 URL 中提取配置。

 ADD http://somehost/config.json /

增加镜像构建上下文的范围

通过从包含共享文件和特定容器文件的父目录构建,将符号链接目标文件包含在构建上下文中。

 cd ..
docker build -f worker-a/Dockerfile .

您在 Dockerfile 中引用的所有源路径也必须更改以匹配新的构建上下文:

 COPY workerathing /app

变成

COPY worker-a/workerathing /app

如果您有一个大型构建上下文,则使用此方法可以使 所有 构建上下文变大,因为它们都是共享的。它会减慢构建速度,尤其是对于远程 Docker 构建服务器。请注意,仅引用 了构建上下文基础中的 .dockerignore 文件。

可以挂载卷的替代构建

其他争取 Dockerfile 兼容性的项目可能在构建时支持卷。例如 podman build / buildah 支持 --volume 选项 将挂载文件从主机绑定到构建容器中。

 podman build --volume /project/config:/worker-config:ro,Z -t me/worker-a .

然后构建可以引用挂载的卷

COPY /worker-config/config.json /app


运行

从命名卷挂载配置目录

像这样的卷只能用作目录,因此您不能像在将文件从主机挂载到容器时那样指定文件。

 docker volume create --name=worker-cfg-vol
docker run -v worker-cfg-vol:/config worker-config cp config.json /config

docker run -v worker-cfg-vol:/config:/config worker-a

从数据容器挂载配置目录

同样,目录只是因为它与上面的基本相同。不过,这会自动将文件从目标目录复制到新创建的共享卷中。

 docker create --name wcc -v /config worker-config /bin/true
docker run --volumes-from wcc worker-a

在运行时从主机挂载配置文件

docker run -v /app/config/config.json:/config.json worker-a

原文由 Matt 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题