我有一个由 Yarn 管理的 monorepo,我想利用 Docker 缓存层来加速我的构建,为此我想先复制 package.json
和 yarn.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/