gpt4 book ai didi

docker - 用于多阶段 docker 构建的工件缓存

转载 作者:行者123 更新时间:2023-12-02 20:02:12 25 4
gpt4 key购买 nike

我有一个这样的 Dockerfile

# build-home
FROM node:10 AS build-home
WORKDIR /usr/src/app
COPY /home/package.json /home/yarn.lock /usr/src/app/
RUN yarn install
COPY ./home ./
RUN yarn build

# build-dashboard
FROM node:10 AS build-dashboard
WORKDIR /usr/src/app
COPY /dashboard/package.json /dashboard/yarn.lock /usr/src/app/
RUN yarn install
COPY ./dashboard ./
RUN yarn build

# run
FROM nginx
EXPOSE 80
COPY nginx.conf /etc/nginx/nginx.conf
COPY --from=build-home /usr/src/app/dist /usr/share/nginx/html/home
COPY --from=build-dashboard /usr/src/app/dist /usr/share/nginx/html/dashboard

这里构建了两个 React 应用程序,然后将构建的工件放入 nginx 中。为了提高构建性能,我需要缓存 dist build-home 中的文件夹和 build-dashboard构建阶段。为此,我创建了一个 volumedocker-compose.yml

...
web:
container_name: web
build:
context: ./web
volumes:
- ./web-build-cache:/usr/src/app
ports:
- 80:80
depends_on:
- api

我已经停在这个阶段了,因为我不明白如何添加 volume创建者 docker-compose首先是build-home阶段,并在添加此 volume 之后到 build-dashboard .也许我应该创建两个卷并将每个卷附加到每个构建阶段,但如何做到这一点?

更新:

Initial build.

家庭应用:

  1. 安装模块:100.91s
  2. 构建应用:39.51 秒

仪表板应用程序:

  1. 安装模块:100.91s
  2. 构建应用:50.38 秒

总时间:

real    8m14.322s
user 0m0.560s
sys 0m0.373s

Second build (没有代码或依赖项更改):

家庭应用:

  1. 安装模块:使用缓存
  2. 构建应用:使用缓存

仪表板应用程序:

  1. 安装模块:使用缓存
  2. 构建应用:使用缓存

总时间:

real    0m2.933s
user 0m0.309s
sys 0m0.427s

Third build (第一个应用程序中的代码略有变化):

家庭应用:

  1. 安装模块:使用缓存
  2. 构建应用:50.04 秒

仪表板应用程序:

  1. 安装模块:使用缓存
  2. 构建应用:使用缓存

总时间:

real    0m58.216s
user 0m0.340s
sys 0m0.445s

Initial build没有 Docker 的家庭应用程序:89.69s

real    1m30.111s
user 2m6.148s
sys 2m17.094s

Second build没有 Docker 的家庭应用程序,dist磁盘上存在文件夹(没有代码或依赖项更改):18.16s

real    0m18.594s
user 0m20.940s
sys 0m2.155s

Third build没有 Docker 的家庭应用程序,dist文件夹存在于磁盘上(代码有小改动):20.44s

real    0m20.886s
user 0m22.472s
sys 0m2.607s

在 docker-container 中,应用程序的第三次构建要长 2 倍。这表明如果第一个构建的结果在磁盘上,其他构建完成得更快。在 docker 容器中,第一个之后的所有程序集都与第一个一样执行,因为没有 dist文件夹。

最佳答案

如果您使用的是多阶段构建,那么 docker 缓存就会出现问题。最终图像没有包含构建步骤的图层。通过一起使用 --target--cache-from,您可以保存这些层并在重建中重用它们。

你需要类似的东西

docker build \
--target build-home \
--cache-from build-home:latest \
-t build-home:latest


docker build \
--target build-dashboard \
--cache-from build-dashboard:latest \
-t build-dashboard:latest


docker build \
--cache-from build-dashboard:latest \
--cache-from build-home:latest \
-t my-image:latest \

您可以在此处找到更多详细信息 https://andrewlock.net/caching-docker-layers-on-serverless-build-hosts-with-multi-stage-builds---target,-and---cache-from/

关于docker - 用于多阶段 docker 构建的工件缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52697948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com