Docker COPY 文件使用 glob 模式?

新手上路,请多包涵

我有一个由 Yarn 管理的 monorepo,我想利用 Docker 缓存层来加速我的构建,为此我想首先复制 package.jsonyarn.lock 文件,运行 yarn install 然后复制其余文件。

这是我的回购结构:

 packages/one/package.json
packages/one/index.js
packages/two/package.json
packages/two/index.js
package.json
yarn.lock

这是 Dockerfile 中感兴趣的部分:

 COPY package.json .
COPY yarn.lock .
COPY packages/**/package.json ./
RUN yarn install --pure-lockfile
COPY . .

问题是第三个 COPY 命令没有复制任何东西,我怎样才能达到预期的结果?

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

阅读 686
2 个回答

有一个基于 多阶段构建 功能的解决方案:

 FROM node:12.18.2-alpine3.11

WORKDIR /app
COPY ["package.json", "yarn.lock", "./"]
# Step 2: Copy whole app
COPY packages packages

# Step 3: Find and remove non-package.json files
RUN find packages \! -name "package.json" -mindepth 2 -maxdepth 2 -print | xargs rm -rf

# Step 4: Define second build stage
FROM node:12.18.2-alpine3.11

WORKDIR /app
# Step 5: Copy files from the first build stage.
COPY --from=0 /app .

RUN yarn install --frozen-lockfile

COPY . .

# To restore workspaces symlinks
RUN yarn install --frozen-lockfile

CMD yarn start

Step 5 层缓存将被重用,即使 packages 目录中的任何文件已更改。

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

正如 官方 Dockerfile 参考中提到的 COPY <src> <dest>

COPY 指令从 <src> 复制新文件或目录,并将它们添加到容器的文件系统中,路径为 <dest>

对于您的情况

每个都可能包含通配符,并且将使用 Go 的 filepath.Match 规则完成匹配。

这些是 规则。它们包含以下内容:

‘*’ 匹配任何非分隔符字符序列

因此,请尝试在您的模式中使用 * 而不是 **

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

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