我有一个回购设置如下:
/config
config.json
/worker-a
Dockerfile
<symlink to config.json>
/code
/worker-b
Dockerfile
<symlink to config.json>
/code但是,构建镜像失败,因为Docker无法处理符号链接。我应该提到我的项目比这复杂得多,所以重组目录不是一个很好的选择。我该如何处理这种情况?
发布于 2016-09-08 11:42:02
Docker doesn't support symlinking files outside the build context.
以下是在容器中使用共享文件的一些不同方法:
共享基础镜像
为包含共享配置/文件的基本worker-config映像创建Dockerfile。
COPY config.json /config.json构建镜像并将其标记为worker-config
docker build -t worker-config:latest .为您的所有worker Dockerfile提供基本worker-config映像
FROM worker-config:latest构建脚本
使用脚本将公共配置推送到每个worker容器。
./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发布于 2019-04-27 15:26:43
我也遇到了这个问题,我想分享另一种上面没有提到的方法。我没有在我的Dockerfile中使用npm link,而是使用了yalc。
yalc,例如在Docker中运行你的库,然后运行yalc publish (如果你的共享库是私有的,则添加--private标志)。这将在本地“发布”您的库。npm install之前,在每个通常使用npm link的存储库中运行yalc add my-lib。它将在您的Docker容器中创建一个本地.yalc文件夹,在node_modules中创建一个指向此文件夹的符号链接,并重写package.json以引用此文件夹,因此您可以安全地运行.yalc。如果您执行两阶段构建,请确保您还将.yalc文件夹复制到您的最终映像。下面是一个示例服务器,假设您有一个单声道存储库,其中包含三个包: models、gui和Dockerfile,并且models存储库必须是共享的并命名为my-models。
# You can access the container using:
# docker run -it my-name sh
# To start it stand-alone:
# docker run -it -p 8888:3000 my-name
FROM node:alpine AS builder
# Install yalc globally (the apk add... line is only needed if your installation requires it)
RUN apk add --no-cache --virtual .gyp python make g++ && \
npm i -g yalc
RUN mkdir /packages && \
mkdir /packages/models && \
mkdir /packages/gui && \
mkdir /packages/server
COPY ./packages/models /packages/models
WORKDIR /packages/models
RUN npm install && \
npm run build && \
yalc publish --private
COPY ./packages/gui /packages/gui
WORKDIR /packages/gui
RUN yalc add my-models && \
npm install && \
npm run build
COPY ./packages/server /packages/server
WORKDIR /packages/server
RUN yalc add my-models && \
npm install && \
npm run build
FROM node:alpine
RUN mkdir -p /app
COPY --from=builder /packages/server/package.json /app/package.json
COPY --from=builder /packages/server/dist /app/dist
# Make sure you copy the yalc registry too.
COPY --from=builder /packages/server/.yalc /app/.yalc
COPY --from=builder /packages/server/node_modules /app/node_modules
COPY --from=builder /packages/gui/dist /app/dist/public
WORKDIR /app
EXPOSE 3000
CMD ["node", "./dist/index.js"]希望这能帮上忙。
发布于 2016-09-08 02:40:24
Docker命令将指定的目录(通常是.)作为“构建上下文”发送到Docker引擎(守护进程)。不要将构建上下文指定为/worker-a,而是将构建上下文指定为根目录,并使用-f参数指定其中一个子目录中Dockerfile的路径。
docker build -f worker-a/Dockerfile .
docker build -f worker-b/Dockerfile .您必须稍微修改您的Dockerfiles文件,以将它们指向../config/config.json,但这是相当容易修复的。
另外,请查看这个问题/答案,我认为它解决了您正在经历的完全相同的问题。
How to include files outside of Docker's build context?
希望这能有所帮助!干杯
https://stackoverflow.com/questions/39376786
复制相似问题