Dockerdoesn't support symlinking files outside the build context.
以下是在容器中使用共享文件的一些不同方法:
分享基础图片
为包含共享配置/文件的基本 worker-config 映像创建一个 Dockerfile。
COPY config.json /config.json
构建图像并将其标记为worker-config
docker build -t worker-config:latest .
为所有工作人员Dockerfiles 获取基本worker-config 图像
FROM 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 构建服务器。请注意,仅引用了来自 the base of the build context 的 .dockerignore 文件。
从命名卷挂载配置目录
像这样的卷只能用作目录,因此您不能像将文件从主机挂载到容器时那样指定文件。
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