做网站都得会什么技术,html5网页设计作品,在线网页视频抓取工具,海口网站建设费用使用构建缓存优化 Docker 镜像构建
目录
实践构建应用程序额外资源后续步骤
假设一个简单的nodejs程序的 Dockerfile如下#xff1a;
FROM node:20-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD [node, ./src/index.js]当你运…使用构建缓存优化 Docker 镜像构建
目录
实践构建应用程序额外资源后续步骤
假设一个简单的nodejs程序的 Dockerfile如下
FROM node:20-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD [node, ./src/index.js]当你运行 docker build 命令来创建新镜像时Docker 会按指定顺序执行 Dockerfile 中的每条指令为每个命令创建一个层。对于每条指令Docker 会检查是否可以重用之前构建中的指令。如果发现之前已经执行过类似的指令Docker 就不需要重新执行而是使用缓存的结果。这样你的构建过程会变得更快、更高效节省宝贵的时间和资源。
有效使用构建缓存可以通过重用之前构建的结果并跳过不必要的工作来实现更快的构建。为了最大化缓存的使用并避免资源密集型和耗时的重建理解缓存失效的工作原理非常重要。以下是一些可能导致缓存失效的情况
RUN 指令的任何更改 会使该层失效。如果 Dockerfile 中的 RUN 命令有任何修改Docker 会检测到变化并使构建缓存失效。使用 COPY 或 ADD 指令复制到镜像中的文件的任何更改。Docker 会监视项目目录中的任何更改无论是内容的变化还是属性如权限的变化Docker 都会将这些修改视为触发缓存失效的原因。一旦某一层失效所有后续层也会失效。如果由于更改导致任何之前的层包括基础镜像或中间层失效Docker 会确保依赖于它的后续层也失效。这保持了构建过程的同步防止不一致。
在编写或编辑 Dockerfile 时注意避免不必要的缓存失效以确保构建尽可能快速和高效地进行。
实践
在本指南中你将学习如何有效使用 Docker 构建缓存来优化 Node.js 应用程序的构建过程。
构建应用程序
下载并安装 Docker Desktop。
打开终端并克隆这个示例应用程序
git clone https://github.com/dockersamples/todo-list-app进入 todo-list-app 目录
cd todo-list-app在这个目录中你会找到名为 Dockerfile 的文件内容如下
FROM node:20-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
EXPOSE 3000
CMD [node, ./src/index.js]执行以下命令来构建 Docker 镜像
docker build .构建过程如下所示
[] Building 20.0s (10/10) FINISHED第一行表示整个构建过程花费了 20.0 秒。第一次构建可能会花费一些时间因为需要安装依赖项。
不做任何更改进行重建
现在在不更改源代码或 Dockerfile 的情况下重新运行 docker build 命令
docker build .后续构建由于缓存机制而变得更快只要命令和上下文保持不变。Docker 会缓存构建过程中生成的中间层。当你在不更改 Dockerfile 或源代码的情况下重新构建镜像时Docker 可以重用缓存的层从而显著加快构建过程。
[] Building 1.0s (9/9) FINISHED后续构建仅在 1.0 秒内完成通过利用缓存层无需重复耗时的步骤如安装依赖项。
步骤描述第一次运行时间第二次运行时间1从 Dockerfile 加载构建定义0.0 秒0.0 秒2加载 docker.io/library/node:20-alpine 的元数据2.7 秒0.9 秒3加载 .dockerignore0.0 秒0.0 秒4加载构建上下文 (上下文大小: 4.60MB)0.1 秒0.0 秒5设置工作目录 (WORKDIR)0.1 秒0.0 秒6将本地代码复制到容器中0.0 秒0.0 秒7运行 yarn install --production10.0 秒0.0 秒8导出层2.2 秒0.0 秒9导出最终镜像3.0 秒0.0 秒
优化 Dockerfile
为了避免每次构建都重新安装相同的依赖项可以重新组织 Dockerfile 以保持依赖项缓存的有效性除非确实需要使其失效。对于基于 Node 的应用程序依赖项定义在 package.json 文件中。你可以在该文件更改时重新安装依赖项但如果文件未更改则使用缓存的依赖项。因此首先复制 package.json 文件然后安装依赖项最后复制其他所有内容。这样只有在 package.json 文件更改时才需要重新创建 yarn 依赖项。
更新 Dockerfile 以首先复制 package.json 文件安装依赖项然后复制其他所有内容
FROM node:20-alpine
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install --production
COPY . .
EXPOSE 3000
CMD [node, src/index.js]在与 Dockerfile 相同的文件夹中创建一个名为 .dockerignore 的文件内容如下
node_modules构建新镜像
docker build .输出如下
[] Building 16.1s (10/10) FINISHED[internal] load build definition from Dockerfile 0.0stransferring dockerfile: 175B 0.0s[internal] load .dockerignore 0.0stransferring context: 2B 0.0s[internal] load metadata for docker.io/library/node:21-alpine 0.0s[internal] load build context 0.8stransferring context: 53.37MB 0.8s[1/5] FROM docker.io/library/node:21-alpine 0.0sCACHED [2/5] WORKDIR /app 0.0s[3/5] COPY package.json yarn.lock ./ 0.2s[4/5] RUN yarn install --production 14.0s[5/5] COPY . . 0.5sexporting to image 0.6sexporting layers 0.6swriting image
sha256:d6f819013566c54c50124ed94d5e66c452325327217f4f04399b45f94e37d25 0.0snaming to docker.io/library/node-app:2.0 0.0s现在修改 src/static/index.html 文件例如将标题更改为 “The Awesome Todo App”。
构建 Docker 镜像。此时你的输出应有所不同
docker build -t node-app:3.0 .输出如下
[] Building 1.2s (10/10) FINISHED [internal] load build definition from Dockerfile 0.0stransferring dockerfile: 37B 0.0s[internal] load .dockerignore 0.0stransferring context: 2B 0.0s[internal] load metadata for docker.io/library/node:21-alpine 0.0s [internal] load build context 0.2stransferring context: 450.43kB 0.2s[1/5] FROM docker.io/library/node:21-alpine 0.0sCACHED [2/5] WORKDIR /app 0.0sCACHED [3/5] COPY package.json yarn.lock ./ 0.0sCACHED [4/5] RUN yarninstall --production 0.0s[5/5] COPY . . 0.5s exporting to image 0.3sexporting layers 0.3swriting image
sha256:91790c87bcb096a83c2bd4eb512bc8b134c757cda0bdee4038187f98148e2eda 0.0snaming to docker.io/library/node-app:3.0 0.0s首先你会注意到构建速度快了很多。你会看到多个步骤使用了之前缓存的层。这是个好消息你正在使用构建缓存。推送和拉取此镜像及其更新也会快得多。
通过遵循这些优化技术你可以加快 Docker 构建速度提高开发效率缩短迭代周期提高开发生产力。