成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基于BuildKit優(yōu)化Dockerfile的構(gòu)建

系統(tǒng) Linux
本文,我們介紹了使用Docker BuildKit優(yōu)化Dockerfile,并因此加快了鏡像構(gòu)建時(shí)間。這些速度的提高,可以幫助我們提高效率和節(jié)省計(jì)算能力。

Docker通過讀取Dockerfile中的指令自動構(gòu)建鏡像,Dockerfile是一個(gè)文本文件,其中依次包含構(gòu)建給定鏡像所需的所有命令。

上面的解釋摘自Docker的官方文檔并總結(jié)了Dockerfile的用途。Dockerfile的使用非常重要,因?yàn)樗俏覀兊乃{(lán)圖,是我們添加到Docker鏡像中的層的記錄。

本文,我們將學(xué)習(xí)如何利用BuildKit功能,這是Docker v18.09上引入的一組增強(qiáng)功能。集成BuildKit將為我們提供更好的性能,存儲管理和安全性。

本文目標(biāo)

  •  減少構(gòu)建時(shí)間;
  •  縮小鏡像尺寸;
  •  獲得可維護(hù)性;
  •  獲得可重復(fù)性;
  •  了解多階段Dockerfile;
  •  了解BuildKit功能。

先決條件

  •  Docker概念知識
  •  已安裝Docker(當(dāng)前使用v19.03)
  •  一個(gè)Java應(yīng)用程序(在本文中,我使用了一個(gè)Jenkins Maven示例應(yīng)用程序)

讓我們開始吧!

簡單的Dockerfile示例

以下是一個(gè)包含Java應(yīng)用程序的未優(yōu)化Dockerfile的示例。我們將逐步進(jìn)行一些優(yōu)化。 

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

在這里,我們可能會問自己:構(gòu)建需要多長時(shí)間?為了回答這個(gè)問題,讓我們在本地開發(fā)環(huán)境上創(chuàng)建該Dockerfile,并讓Docker構(gòu)建鏡像。 

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

此時(shí),我們的構(gòu)建需要1m55s。

如果我們僅啟用BuildKit而沒有其他更改,會有什么不同嗎?

啟用BuildKit

BuildKit可以通過兩種方法啟用:

在調(diào)用Docker build命令時(shí)設(shè)置DOCKER_BUILDKIT = 1環(huán)境變量,例如: 

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

將Docker BuildKit設(shè)置為默認(rèn)開啟,需要在/etc/docker/daemon.json進(jìn)行如下設(shè)置,然后重啟: 

  1. { "features": { "buildkit": true } } 

BuildKit最初的效果 

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

此時(shí),我們的構(gòu)建需要1m43s。在相同的硬件上,構(gòu)建花費(fèi)的時(shí)間比以前少了約12秒。這意味著構(gòu)建幾乎無需費(fèi)力即可節(jié)約10%左右的時(shí)間。

現(xiàn)在讓我們看看是否可以采取一些額外的步驟來進(jìn)一步改善。

從最小到最頻繁變化的順序

因?yàn)轫樞驅(qū)τ诰彺婧苤匾晕覀儗OPY命令移到更靠近Dockerfile末尾的位置。 

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

避免使用“COPY .”

選擇更具體的COPY參數(shù),以避免緩存中斷。僅復(fù)制所需內(nèi)容。 

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

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

這樣可以防止使用過時(shí)的程序包緩存。 

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

刪除不必要的依賴

在開始時(shí),不要安裝調(diào)試和編輯工具,以后可以在需要時(shí)安裝它們。 

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

刪除程序包管理器緩存

你的鏡像不需要此緩存數(shù)據(jù)。借此機(jī)會釋放一些空間。 

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

盡可能使用官方鏡像

使用官方鏡像有很多理由,例如減少鏡像維護(hù)時(shí)間和減小鏡像尺寸,以及預(yù)先配置鏡像以供容器使用。 

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

使用特定標(biāo)簽

請勿使用latest標(biāo)簽。 

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

尋找最小的鏡像

以下是openjdk鏡像列表。選擇最適合自己的最輕的那個(gè)鏡像。 

  1. REPOSITORY TAG標(biāo)簽 SIZE大小  
  2. openjdk 8 634MB  
  3. openjdk 8-jre 443MB  
  4. openjdk 8-jre-slim 204MB  
  5. openjdk 8-jre-alpine 83MB 

在一致的環(huán)境中從源構(gòu)建

如果你不需要整個(gè)JDK,則可以使用Maven Docker鏡像作為構(gòu)建基礎(chǔ)。 

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

在單獨(dú)的步驟中獲取依賴項(xiàng)

可以緩存–用于獲取依賴項(xiàng)的Dockerfile命令。緩存此步驟將加快構(gòu)建速度。 

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

多階段構(gòu)建:刪除構(gòu)建依賴項(xiàng)

為什么要使用多階段構(gòu)建?

  •  將構(gòu)建與運(yùn)行時(shí)環(huán)境分開
  •  DRY方式
    •  具有開發(fā),測試等環(huán)境的不同詳細(xì)信息
  •  線性化依賴關(guān)系
  •  具有特定于平臺的階段 
  1. FROM maven:3.6-jdk-8-alpine AS builder  
  2. WORKDIR /app  
  3. COPY pom.xml .  
  4. RUN mvn -e -B dependency:resolve  
  5. COPY src ./src  
  6. RUN mvn -e -B package  
  7. FROM openjdk:8-jre-alpine  
  8. COPY --from=builder /app/target/my-app-1.0-SNAPSHOT.jar /  
  9. CMD [“java”, “-jar”, “/my-app-1.0-SNAPSHOT.jar”] 

如果你此時(shí)構(gòu)建我們的應(yīng)用程序, 

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

你會注意到我們的應(yīng)用程序構(gòu)建需要大約35.66秒的時(shí)間。這是一個(gè)令人愉快的進(jìn)步。

下面,我們將介紹其他場景的功能。

多階段構(gòu)建:不同的鏡像風(fēng)格

下面的Dockerfile顯示了基于Debian和基于Alpine的鏡像的不同階段。 

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

要構(gòu)建特定的鏡像,我們可以使用–target參數(shù): 

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

不同的鏡像風(fēng)格(DRY /全局ARG) 

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

ARG命令可以指定要構(gòu)建的鏡像。在上面的例子中,我們指定alpine為默認(rèn)的鏡像,但我們也可以在docker build命令中,通過–build-arg flavor=參數(shù)指定鏡像。

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

并發(fā)

并發(fā)在構(gòu)建Docker鏡像時(shí)很重要,因?yàn)樗鼤浞掷每捎玫腃PU線程。在線性Dockerfile中,所有階段均按順序執(zhí)行。通過多階段構(gòu)建,我們可以讓較小的依賴階段準(zhǔn)備就緒,以供主階段使用它們。

BuildKit甚至帶來了另一個(gè)性能上的好處。如果在以后的構(gòu)建中不使用該階段,則在結(jié)束時(shí)將直接跳過這些階段,而不是對其進(jìn)行處理和丟棄。

下面是一個(gè)示例Dockerfile,其中網(wǎng)站的資產(chǎn)是在一個(gè)assets階段中構(gòu)建的: 

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

這是另一個(gè)Dockerfile,其中分別編譯了C和C ++庫,并在builder以后使用該階段。 

  1. FROM maven:3.6-jdk-8-alpine AS builder-base  
  2. … 
  3. FROM gcc:8-alpine AS builder-someClib  
  4. … 
  5. RUN git clone … ./configure --prefix=/out && make && make install  
  6. FROM g++:8-alpine AS builder-some CPPlib  
  7. …  
  8. RUN git clone … && cmake …  
  9. FROM builder-base AS builder  
  10. COPY --from=builder-someClib /out /  
  11. COPY --from=builder-someCpplib /out / 

BuildKit應(yīng)用程序緩存

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

包管理器 路徑 

  1. apt /var/lib/apt/lists  
  2. go ~/.cache/go-build  
  3. go-modules $GOPATH/pkg/mod  
  4. npm ~/.npm  
  5. pip ~/.cache/pip 

我們可以將此Dockerfile與上面介紹的在一致的環(huán)境中從源代碼構(gòu)建中介紹的Dockerfile進(jìn)行比較。這個(gè)較早的Dockerfile沒有特殊的緩存處理。我們可以使用–mount=type=cache來做到這一點(diǎn)。 

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

BuildKit的安全功能

BuildKit具有安全功能,下面的示例中,我們使用了–mount=type=secret隱藏了一些機(jī)密文件,例如~/.aws/credentials。 

  1. FROM <baseimage>  
  2. RUN …  
  3. RUN --mount=type=secret,id=aws,target=/root/.aws/credentials,required \  
  4. ./fetch-assets-from-s3.sh  
  5. RUN ./build-scripts.sh  

要構(gòu)建此Dockerfile,需要使用–secret參數(shù): 

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

還有為了提高安全性,避免使用諸如COPY ./keys/private.pem /root .ssh/private.pem之類的命令,我們可以使用BuildKit中的ssh解決此問題: 

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

要構(gòu)建此Dockerfile,你需要在ssh-agent中加載到你的SSH私鑰。 

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

結(jié)論

本文,我們介紹了使用Docker BuildKit優(yōu)化Dockerfile,并因此加快了鏡像構(gòu)建時(shí)間。這些速度的提高,可以幫助我們提高效率和節(jié)省計(jì)算能力。 

 

責(zé)任編輯:龐桂玉 來源: 馬哥Linux運(yùn)維
相關(guān)推薦

2023-06-08 07:37:42

Docker容器

2014-11-18 10:37:15

dockerlinux技巧

2022-10-21 16:07:10

編碼器自然語言模型

2019-03-15 15:00:49

Webpack構(gòu)建速度前端

2023-09-25 10:19:01

模型App開源

2021-02-24 09:15:48

kubernetes混合云云端

2019-10-21 11:43:00

DockerGradleJava

2024-03-06 18:11:06

Docker鏡像技術(shù)

2022-07-27 09:59:58

前端Webpack

2022-12-08 16:02:39

數(shù)據(jù)架構(gòu)工具

2014-07-18 09:59:17

移動webJavascript移動Web

2011-12-15 13:28:57

2012-10-30 10:09:56

Redis

2017-11-22 13:01:03

Go技術(shù)棧構(gòu)建

2022-04-22 14:41:12

美團(tuán)慢查詢數(shù)據(jù)庫

2021-05-17 09:27:07

項(xiàng)目實(shí)戰(zhàn)優(yōu)化項(xiàng)目構(gòu)建時(shí)間

2018-06-26 10:34:39

云遷移架構(gòu)云計(jì)算

2017-04-18 21:27:01

AndroidAPP構(gòu)建速度

2025-05-22 06:34:28

2018-10-25 14:00:58

LinuxSlax
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲精品一区二区 | 亚洲欧美综合精品久久成人 | 91精品国产综合久久久久久 | 成人av播放 | 亚洲九九精品 | 国产精品高潮呻吟久久 | 视频一二三区 | 中文在线播放 | 成年人网站在线观看视频 | 精品久久久久久久 | 午夜视频一区二区三区 | 午夜免费电影院 | 国产精品久久久久久久久久 | 亚洲精品视频在线看 | 午夜精品久久久久久久久久久久久 | 午夜精品一区二区三区在线观看 | 国产农村一级片 | 日本a∨视频 | 在线看片福利 | 精品一二三区在线观看 | 91成人影院 | 特级丰满少妇一级aaaa爱毛片 | 日本免费黄色一级片 | 亚洲国产精品一区二区三区 | 国产精品毛片一区二区在线看 | 欧美精品在线一区 | 91免费在线看 | 亚洲精品视频免费观看 | 国产二区三区 | 国产成人叼嘿视频在线观看 | 国产精品视频中文字幕 | 99久久精品免费看国产四区 | 成人在线免费观看视频 | 91视频在线 | 一区二区三区视频在线免费观看 | 免费特级黄毛片 | 日韩成人av在线 | 日韩三级 | 成人激情视频免费观看 | 国产精品视频一二三区 | 日韩精品成人 |