首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于多级码头构建的工件缓存

用于多级码头构建的工件缓存
EN

Stack Overflow用户
提问于 2018-10-08 08:09:20
回答 2查看 2.8K关注 0票数 3

我有这样的文件

代码语言:javascript
复制
# 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-homebuild-dashboard构建阶段。为此,我在volume中创建了一个docker-compose.yml

代码语言:javascript
复制
...
  web:
    container_name: web
    build:
      context: ./web
    volumes:
      - ./web-build-cache:/usr/src/app
    ports:
      - 80:80
    depends_on:
      - api

我在这个阶段已经停止了,因为我不知道如何首先为volume阶段添加由docker-compose创建的volume,然后将这个volume添加到build-dashboard中。也许我应该创建两个卷,并将每个卷附加到每个构建阶段,但是如何做到这一点呢?

更新:

最初的建造。

家庭申请:

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

仪表板应用程序:

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

总时间:

代码语言:javascript
复制
real    8m14.322s
user    0m0.560s
sys     0m0.373s

第二次建造 (不改变代码或依赖项):

家庭申请:

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

仪表板应用程序:

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

总时间:

代码语言:javascript
复制
real    0m2.933s
user    0m0.309s
sys     0m0.427s

第三次建造 (在第一个应用程序中对代码做了小改动):

家庭申请:

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

仪表板应用程序:

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

总时间:

代码语言:javascript
复制
real    0m58.216s
user    0m0.340s
sys     0m0.445s

无码头家庭应用程序的初始构建:89.69s

代码语言:javascript
复制
real    1m30.111s
user    2m6.148s
sys     2m17.094s

没有Docker的家庭应用程序的第二次建造dist文件夹存在于磁盘上(不改变代码或依赖项):18.16 s

代码语言:javascript
复制
real    0m18.594s
user    0m20.940s
sys     0m2.155s

没有Docker的家庭应用程序的第三次建造dist文件夹存在于磁盘上(代码有小变化):20.44 s

代码语言:javascript
复制
real    0m20.886s
user    0m22.472s
sys     0m2.607s

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

EN

回答 2

Stack Overflow用户

发布于 2019-07-09 09:55:56

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

你需要这样的东西

代码语言:javascript
复制
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/上找到更多详细信息

票数 3
EN

Stack Overflow用户

发布于 2018-10-08 11:29:58

您不能在图像构建期间使用卷,而且在任何情况下,Docker已经完成了您所要求的缓存。如果您将Dockerfile保持为-原样,而不尝试将代码按卷添加到docker-compose.yml中,那么您应该像预期的那样获得构建的Javascript文件访问重新构建的缓存。

运行docker build时,Docker依次查看每个步骤。如果步骤的输入没有改变,步骤本身也没有改变,并且正在添加的任何文件都没有改变,那么Docker将只是重用之前运行该步骤的结果。在您的Dockerfile中,如果只更改nginx配置,它将跳过所有Javascript构建步骤,并重用上一次的结果。

(您已经拥有的另一种相关技术是分两个步骤构建应用程序:首先在命名依赖项的package.jsonyarn.lock等文件中复制,然后安装依赖项;然后复制并构建应用程序。由于“安装依赖项”步骤通常是耗时的,而且依赖项的更改相对较少,因此希望鼓励Docker重用上一次构建的node_modules目录。)

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

https://stackoverflow.com/questions/52697948

复制
相关文章

相似问题

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