首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker和symlink

Docker和symlink
EN

Stack Overflow用户
提问于 2016-09-08 02:22:59
回答 4查看 72.5K关注 0票数 57

我有一个回购设置如下:

代码语言:javascript
复制
/config
   config.json
/worker-a
   Dockerfile
   <symlink to config.json>
   /code
/worker-b
   Dockerfile
   <symlink to config.json>
   /code

但是,构建镜像失败,因为Docker无法处理符号链接。我应该提到我的项目比这复杂得多,所以重组目录不是一个很好的选择。我该如何处理这种情况?

EN

回答 4

Stack Overflow用户

发布于 2016-09-08 11:42:02

Docker doesn't support symlinking files outside the build context.

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

共享基础镜像

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

代码语言:javascript
复制
COPY config.json /config.json

构建镜像并将其标记为worker-config

代码语言:javascript
复制
docker build -t worker-config:latest .

为您的所有worker Dockerfile提供基本worker-config映像

代码语言:javascript
复制
FROM worker-config:latest

构建脚本

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

./build worker-n

代码语言:javascript
复制
#!/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中提取配置。

代码语言:javascript
复制
ADD http://somehost/config.json /

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

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

代码语言:javascript
复制
cd ..
docker build -f worker-a/Dockerfile .

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

代码语言:javascript
复制
COPY workerathing /app

变成了

代码语言:javascript
复制
COPY worker-a/workerathing /app

如果您有一个较大的构建上下文,则使用此方法可以使所有构建上下文变得较大,因为它们都是共享的。它会减慢构建速度,尤其是远程Docker构建服务器。请注意,仅引用来自the base of the build context.dockerignore文件。

从指定的卷挂载配置目录

像这样的卷只能作为目录工作,所以在将文件从主机挂载到容器时,您不能像这样指定文件。

代码语言:javascript
复制
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

从数据容器挂载配置目录

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

代码语言:javascript
复制
docker create --name wcc -v /config worker-config /bin/true
docker run --volumes-from wcc worker-a

从主机装载配置文件

代码语言:javascript
复制
docker run -v /app/config/config.json:/config.json worker-a
票数 72
EN

Stack Overflow用户

发布于 2019-04-27 15:26:43

我也遇到了这个问题,我想分享另一种上面没有提到的方法。我没有在我的Dockerfile中使用npm link,而是使用了yalc

  1. 在你的容器中安装yalc,例如在Docker中运行你的库,然后运行yalc publish (如果你的共享库是私有的,则添加--private标志)。这将在本地“发布”您的库。
  2. 在运行npm install之前,在每个通常使用npm link的存储库中运行yalc add my-lib。它将在您的Docker容器中创建一个本地.yalc文件夹,在node_modules中创建一个指向此文件夹的符号链接,并重写package.json以引用此文件夹,因此您可以安全地运行.yalc。如果您执行两阶段构建,请确保您还将.yalc文件夹复制到您的最终映像。

下面是一个示例服务器,假设您有一个单声道存储库,其中包含三个包: models、gui和Dockerfile,并且models存储库必须是共享的并命名为my-models

代码语言:javascript
复制
# 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"]

希望这能帮上忙。

票数 6
EN

Stack Overflow用户

发布于 2016-09-08 02:40:24

Docker命令将指定的目录(通常是.)作为“构建上下文”发送到Docker引擎(守护进程)。不要将构建上下文指定为/worker-a,而是将构建上下文指定为根目录,并使用-f参数指定其中一个子目录中Dockerfile的路径。

代码语言:javascript
复制
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?

希望这能有所帮助!干杯

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39376786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档