Docker COPY 文件使用 glob 模式?

标签 docker dockerfile yarnpkg

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

这是我的 repo 结构:

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命令没有复制任何东西,我怎样才能达到预期的效果?

最佳答案

有一个基于multistage-build的解决方案特点:

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目录中的任何文件发生变化,图层缓存也会被重用。

关于Docker COPY 文件使用 glob 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49939960/

相关文章:

docker - 来自守护程序: cannot stop container的错误响应

docker - 使用 dockerfile 生成 ssh key

php - composer.json 中 "conflict"的用法是什么,我该怎么做?

javascript - 如何为后端和前端使用一个包管理器? ( yarn /NPM)

docker - 使用Dockerfile进行构建时如何解决 “No such file or directory”错误

docker - 如何自动删除未使用的 docker 镜像和容器?

django - 使用 PostgreSQL Dockerize 我的 Django 应用程序,数据库意外启动和关闭

php - Docker Redis 连接被拒绝

javascript - yarn - Typicode 的 husky 兼容性

docker - 从 docker 镜像中删除环境变量