iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >BuildKit优化Dockerfile的构建是怎样的
  • 407
分享到

BuildKit优化Dockerfile的构建是怎样的

2023-06-15 13:06:40 407人浏览 安东尼
摘要

今天就跟大家聊聊有关BuildKit优化Dockerfile的构建是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Docker通过读取Dockerfile中的指令自动构建镜像,

今天就跟大家聊聊有关BuildKit优化Dockerfile的构建是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

Docker通过读取Dockerfile中的指令自动构建镜像,Dockerfile是一个文本文件,其中依次包含构建给定镜像所需的所有命令。

BuildKit优化Dockerfile的构建是怎样的

上面的解释摘自Docker的官方文档并总结了Dockerfile的用途。Dockerfile的使用非常重要,因为它是我们的蓝图,是我们添加到Docker镜像中的层的记录。

本文,我们将学习如何利用BuildKit功能,这是Docker v18.09上引入的一组增强功能。集成BuildKit将为我们提供更好的性能,存储管理和安全性。

本文目标

  •  减少构建时间;

  •  缩小镜像尺寸;

  •  获得可维护性;

  •  获得可重复性;

  •  了解多阶段Dockerfile;

  •  了解BuildKit功能。

先决条件

  •  Docker概念知识

  •  已安装Docker(当前使用v19.03)

  •  一个Java应用程序(在本文中,我使用了一个jenkins Maven示例应用程序)

让我们开始吧!

简单的Dockerfile示例

以下是一个包含Java应用程序的未优化Dockerfile的示例。我们将逐步进行一些优化。

FROM debian  COPY . /app  RUN apt-get update  RUN apt-get -y install openjdk-11-jdk ssh eMacs  CMD [“java”, “-jar”, “/app/target/my-app-1.0-SNAPSHOT.jar”]

在这里,我们可能会问自己:构建需要多长时间?为了回答这个问题,让我们在本地开发环境上创建该Dockerfile,并让Docker构建镜像。

# enter your Java app folder  cd simple-java-maven-app-master  # create a Dockerfile  vim Dockerfile  # write content, save and exit  docker pull debian:latest # pull the source image  time docker build --no-cache -t docker-class . # overwrite previous layers  # notice the build time  0,21s user 0,23s system 0% cpu 1:55,17 total

此时,我们的构建需要1m55s。

如果我们仅启用BuildKit而没有其他更改,会有什么不同吗?

启用BuildKit

BuildKit可以通过两种方法启用:

在调用Docker build命令时设置DOCKER_BUILDKIT = 1环境变量,例如:

time DOCKER_BUILDKIT=1 docker build --no-cache -t docker-class

将Docker BuildKit设置为默认开启,需要在/etc/docker/daemon.JSON进行如下设置,然后重启:

{ "features": { "buildkit": true } }

BuildKit最初的效果

DOCKER_BUILDKIT=1 docker build --no-cache -t docker-class .  0,54s user 0,93s system 1% cpu 1:43,00 total

此时,我们的构建需要1m43s。在相同的硬件上,构建花费的时间比以前少了约12秒。这意味着构建几乎无需费力即可节约10%左右的时间。

现在让我们看看是否可以采取一些额外的步骤来进一步改善。

从最小到最频繁变化的顺序

因为顺序对于缓存很重要,所以我们将COPY命令移到更靠近Dockerfile末尾的位置。

FROM debian  RUN apt-get update  RUN apt-get -y install openjdk-11-jdk ssh emacs  RUN COPY . /app  CMD [“java”, “-jar”, “/app/target/my-app-1.0-SNAPSHOT.jar”]

避免使用“COPY .”

选择更具体的COPY参数,以避免缓存中断。仅复制所需内容。

FROM debian  RUN apt-get update  RUN apt-get -y install openjdk-11-jdk ssh vim  COPY target/my-app-1.0-SNAPSHOT.jar /app  CMD [“java”, “-jar”, “/app/my-app-1.0-SNAPSHOT.jar”]

apt-get update 和install命令一起使用

这样可以防止使用过时的程序包缓存。

FROM debian  RUN apt-get update && \      apt-get -y install openjdk-11-jdk ssh vim  COPY target/my-app-1.0-SNAPSHOT.jar /app  CMD [“java”, “-jar”, “/app/my-app-1.0-SNAPSHOT.jar”]

删除不必要的依赖

在开始时,不要安装调试和编辑工具,以后可以在需要时安装它们。

FROM debian  RUN apt-get update && \      apt-get -y install --no-install-recommends \      openjdk-11-jdk  COPY target/my-app-1.0-SNAPSHOT.jar /app  CMD [“java”, “-jar”, “/app/my-app-1.0-SNAPSHOT.jar”]

删除程序包管理器缓存

你的镜像不需要此缓存数据。借此机会释放一些空间。

FROM debian  RUN apt-get update && \      apt-get -y install --no-install-recommends \      openjdk-11-jdk && \      rm -rf /var/lib/apt/lists/*  COPY target/my-app-1.0-SNAPSHOT.jar /app  CMD [“java”, “-jar”, “/app/my-app-1.0-SNAPSHOT.jar”]

尽可能使用官方镜像

使用官方镜像有很多理由,例如减少镜像维护时间和减小镜像尺寸,以及预先配置镜像以供容器使用。

FROM openjdk  COPY target/my-app-1.0-SNAPSHOT.jar /app  CMD [“java”, “-jar”, “/app/my-app-1.0-SNAPSHOT.jar”]

使用特定标签

请勿使用latest标签。

FROM openjdk:8  COPY target/my-app-1.0-SNAPSHOT.jar /app  CMD [“java”, “-jar”, “/app/my-app-1.0-SNAPSHOT.jar”]

寻找最小的镜像

以下是openjdk镜像列表。选择最适合自己的最轻的那个镜像。

REPOSITORY TAG标签 SIZE大小  openjdk 8 634MB  openjdk 8-jre 443MB  openjdk 8-jre-slim 204MB  openjdk 8-jre-alpine 83MB

在一致的环境中从源构建

如果你不需要整个JDK,则可以使用Maven Docker镜像作为构建基础。

FROM maven:3.6-jdk-8-alpine  WORKDIR /app  COPY pom.xml .  COPY src ./src  RUN mvn -e -B package  CMD [“java”, “-jar”, “/app/my-app-1.0-SNAPSHOT.jar”]

在单独的步骤中获取依赖项

可以缓存–用于获取依赖项的Dockerfile命令。缓存此步骤将加快构建速度。

FROM maven:3.6-jdk-8-alpine  WORKDIR /app  COPY pom.xml .  RUN mvn -e -B dependency:resolve  COPY src ./src  RUN mvn -e -B package  CMD [“java”, “-jar”, “/app/my-app-1.0-SNAPSHOT.jar”]

多阶段构建:删除构建依赖项

为什么要使用多阶段构建?

  •  将构建与运行时环境分开

  •  DRY方式

    •  具有开发,测试等环境的不同详细信息

  •  线性化依赖关系

  •  具有特定于平台的阶段 

FROM maven:3.6-jdk-8-alpine AS builder  WORKDIR /app  COPY pom.xml .  RUN mvn -e -B dependency:resolve  COPY src ./src  RUN mvn -e -B package  FROM openjdk:8-jre-alpine  COPY --from=builder /app/target/my-app-1.0-SNAPSHOT.jar /  CMD [“java”, “-jar”, “/my-app-1.0-SNAPSHOT.jar”]

如果你此时构建我们的应用程序,

time DOCKER_BUILDKIT=1 docker build --no-cache -t docker-class .  0,41s user 0,54s system 2% cpu 35,656 total

你会注意到我们的应用程序构建需要大约35.66秒的时间。这是一个令人愉快的进步。

下面,我们将介绍其他场景的功能。

多阶段构建:不同的镜像风格

下面的Dockerfile显示了基于Debian和基于Alpine的镜像的不同阶段。

FROM maven:3.6-jdk-8-alpine AS builder  …  FROM openjdk:8-jre-jessie AS release-jessie  COPY --from=builder /app/target/my-app-1.0-SNAPSHOT.jar /  CMD [“java”, “-jar”, “/my-app-1.0-SNAPSHOT.jar”]  FROM openjdk:8-jre-alpine AS release-alpine  COPY --from=builder /app/target/my-app-1.0-SNAPSHOT.jar /  CMD [“java”, “-jar”, “/my-app-1.0-SNAPSHOT.jar”]

要构建特定的镜像,我们可以使用–target参数:

time docker build --no-cache --target release-jessie .

不同的镜像风格(DRY /全局ARG) 

ARG flavor=alpine  FROM maven:3.6-jdk-8-alpine AS builder  …  FROM openjdk:8-jre-$flavor AS release  COPY --from=builder /app/target/my-app-1.0-SNAPSHOT.jar /  CMD [“java”, “-jar”, “/my-app-1.0-SNAPSHOT.jar”]

ARG命令可以指定要构建的镜像。在上面的例子中,我们指定alpine为默认的镜像,但我们也可以在docker build命令中,通过–build-arg flavor=参数指定镜像。

time docker build --no-cache --target release --build-arg flavor=jessie .

并发

并发在构建Docker镜像时很重要,因为它会充分利用可用的CPU线程。在线性Dockerfile中,所有阶段均按顺序执行。通过多阶段构建,我们可以让较小的依赖阶段准备就绪,以供主阶段使用它们。

BuildKit甚至带来了另一个性能上的好处。如果在以后的构建中不使用该阶段,则在结束时将直接跳过这些阶段,而不是对其进行处理和丢弃。

下面是一个示例Dockerfile,其中网站的资产是在一个assets阶段中构建的:

FROM maven:3.6-jdk-8-alpine AS builder  …  FROM tiborvass/whalesay AS assets  RUN whalesay “Hello DockerCon!” > out/assets.html  FROM openjdk:8-jre-alpine AS release  COPY --from=builder /app/my-app-1.0-SNAPSHOT.jar /  COPY --from=assets /out /assets  CMD [“java”, “-jar”, “/my-app-1.0-SNAPSHOT.jar”]

这是另一个Dockerfile,其中分别编译了C和C ++库,并在builder以后使用该阶段。

FROM maven:3.6-jdk-8-alpine AS builder-base  … FROM GCc:8-alpine AS builder-someClib  … RUN git clone … ./configure --prefix=/out && make && make install  FROM g++:8-alpine AS builder-some CPPlib  …  RUN git clone … && cmake …  FROM builder-base AS builder  COPY --from=builder-someClib /out /  COPY --from=builder-someCpplib /out /

BuildKit应用程序缓存

BuildKit具有程序包管理器缓存的特殊功能。以下是一些缓存文件夹位置的示例:

包管理器 路径

apt /var/lib/apt/lists  Go ~/.cache/go-build  go-modules $GOPATH/pkg/mod  npm ~/.npm  pip ~/.cache/pip

我们可以将此Dockerfile与上面介绍的在一致的环境中从源代码构建中介绍的Dockerfile进行比较。这个较早的Dockerfile没有特殊的缓存处理。我们可以使用–mount=type=cache来做到这一点。

FROM maven:3.6-jdk-8-alpine AS builder  WORKDIR /app  RUN --mount=target=. --mount=type=cache,target /root/.m2 \      && mvn package -DoutputDirectory=/  FROM openjdk:8-jre-alpine  COPY --from=builder /app/target/my-app-1.0-SNAPSHOT.jar /  CMD [“java”, “-jar”, “/my-app-1.0-SNAPSHOT.jar”]

BuildKit的安全功能

BuildKit具有安全功能,下面的示例中,我们使用了–mount=type=secret隐藏了一些机密文件,例如~/.aws/credentials。

FROM <baseimage>  RUN &hellip;  RUN --mount=type=secret,id=aws,target=/root/.aws/credentials,required \  ./fetch-assets-from-s3.sh  RUN ./build-scripts.sh

要构建此Dockerfile,需要使用&ndash;secret参数:

docker build --secret id=aws,src=~/.aws/credentials

还有为了提高安全性,避免使用诸如COPY ./keys/private.pem /root .ssh/private.pem之类的命令,我们可以使用BuildKit中的ssh解决此问题:

FROM alpine  RUN apk add --no-cache openssh-client  RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan GitHub.com >> ~/.ssh/known_hosts  ARG REPO_REF=19ba7bcd9976ef8a9bd086187df19ba7bcd997f2  RUN --mount=type=ssh,required git clone git@github.com:org/repo /work && cd /work && git checkout -b $REPO_REF

要构建此Dockerfile,你需要在ssh-agent中加载到你的SSH私钥。

eval $(ssh-agent)  ssh-add ~/.ssh/id_rsa # this is the SSH key default location  docker build --ssh=default .

看完上述内容,你们对BuildKit优化Dockerfile的构建是怎样的有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网精选频道,感谢大家的支持。

--结束END--

本文标题: BuildKit优化Dockerfile的构建是怎样的

本文链接: https://www.lsjlt.com/news/280305.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • BuildKit优化Dockerfile的构建是怎样的
    今天就跟大家聊聊有关BuildKit优化Dockerfile的构建是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Docker通过读取Dockerfile中的指令自动构建镜像,...
    99+
    2023-06-15
  • 怎样对Webpack构建速度进行优化
    怎样对Webpack构建速度进行优化,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。如何输出Web...
    99+
    2024-04-02
  • 从JavaScript到TypeScript的模块化和构建是怎样的
    今天就跟大家聊聊有关从JavaScript到TypeScript的模块化和构建是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。TypeScri...
    99+
    2024-04-02
  • 十四个JavaScript的优化代码建议是怎样的
    今天就跟大家聊聊有关十四个JavaScript的优化代码建议是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JavaScript 已经成为当下...
    99+
    2024-04-02
  • MYSQL的优化是怎样进行的
    本篇文章给大家分享的是有关MYSQL的优化是怎样进行的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.数据库的设计尽量把数据库设计的更小的占...
    99+
    2024-04-02
  • mysql 优化框架是怎样的
    本篇文章给大家分享的是有关mysql 优化框架是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 MySQL优...
    99+
    2024-04-02
  • MySQL优化经验是怎样的
    MySQL优化经验是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。MySQL优化经验同时在线访问量继续增大 对于1G内存的服务器明显...
    99+
    2024-04-02
  • Nginx的SSL配置优化是怎样的
    Nginx的SSL配置优化是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Nginx的SSL配置优化 一般网站使用的SSL证书都是RSA证书,这种证书基本都是2...
    99+
    2023-06-04
  • mysql 优化的通配符是怎样的
    本篇文章为大家展示了mysql 优化的通配符是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 mysql 再查询数据时,使用wh...
    99+
    2024-04-02
  • CentOS Samba服务器的构建是怎样的
    CentOS Samba 服务器的构建是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。CentOS系统已经被广泛使用,但在我们使用 Windows 作为客户机的时候,...
    99+
    2023-06-16
  • Dockerfile构建自定义镜像的实现
    目录前言 Dockerfile简介 Dockerfile构建镜像的流程 Dockerfile使用 前言 前面文章中使用docker运行容器使用的镜像都是从dockerhub上远程p...
    99+
    2024-04-02
  • MySQL关于In的优化是怎么样的
    本篇文章给大家分享的是有关MySQL关于In的优化是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 MyS...
    99+
    2024-04-02
  • if语句的几种优化是怎样的
    if语句的几种优化是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。UglifyJS是一个对javascript进行压缩和...
    99+
    2024-04-02
  • 优化sql的利器SQLT是怎么样的
    优化sql的利器SQLT是怎么样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。优化sql的利器SQLTSqlt适用环境:sql优化功底不是很深的同学sql太复杂(2000行以...
    99+
    2023-06-06
  • docker通过Dockerfile构建mysql镜像的方法
    构建Dockerfile ,路径 /docker/mysql FROM hub.c.163.com/library/mysql:5.7 #作者信息 MAINTAINER hu "**...
    99+
    2024-04-02
  • JavaScript中优化条件表达式相关的重构思路是怎样的
    JavaScript中优化条件表达式相关的重构思路是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。JavaScript 是一种易于学习的...
    99+
    2024-04-02
  • MySQL数据库优化是怎么样的
    这期内容当中小编将会给大家带来有关MySQL数据库优化是怎么样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的...
    99+
    2024-04-02
  • Tomcat 7优化前及优化后的性能对比是怎样的
    本篇文章为大家展示了Tomcat 7优化前及优化后的性能对比是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、运行环境CPU: Intel(R) Penti...
    99+
    2024-04-02
  • SQL中的结构化查询语言是怎样的
    SQL中的结构化查询语言是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。SQL(结构化查询语言)是一门用于管理关系型数据库和对数据库...
    99+
    2024-04-02
  • Go结构体序列化的实现是怎样的
    Go结构体序列化的实现是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我们将回到之前写的showMovieHandler方法,并更新它以返回一个JSON响...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作