今天就跟大家聊聊有關(guān)BuildKit優(yōu)化Dockerfile的構(gòu)建是怎樣的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)公司主營(yíng)汝州網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶APP開發(fā),汝州h5重慶小程序開發(fā)搭建,汝州網(wǎng)站營(yíng)銷推廣歡迎汝州等地區(qū)企業(yè)咨詢
Docker通過讀取Dockerfile中的指令自動(dòng)構(gòu)建鏡像,Dockerfile是一個(gè)文本文件,其中依次包含構(gòu)建給定鏡像所需的所有命令。
上面的解釋摘自Docker的官方文檔并總結(jié)了Dockerfile的用途。Dockerfile的使用非常重要,因?yàn)樗俏覀兊乃{(lán)圖,是我們添加到Docker鏡像中的層的記錄。
本文,我們將學(xué)習(xí)如何利用BuildKit功能,這是Docker v18.09上引入的一組增強(qiáng)功能。集成BuildKit將為我們提供更好的性能,存儲(chǔ)管理和安全性。
減少構(gòu)建時(shí)間;
縮小鏡像尺寸;
獲得可維護(hù)性;
獲得可重復(fù)性;
了解多階段Dockerfile;
了解BuildKit功能。
Docker概念知識(shí)
已安裝Docker(當(dāng)前使用v19.03)
一個(gè)Java應(yīng)用程序(在本文中,我使用了一個(gè)Jenkins Maven示例應(yīng)用程序)
讓我們開始吧!
以下是一個(gè)包含Java應(yīng)用程序的未優(yōu)化Dockerfile的示例。我們將逐步進(jìn)行一些優(yōu)化。
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”]
在這里,我們可能會(huì)問自己:構(gòu)建需要多長(zhǎng)時(shí)間?為了回答這個(gè)問題,讓我們?cè)诒镜亻_發(fā)環(huán)境上創(chuàng)建該Dockerfile,并讓Docker構(gòu)建鏡像。
# 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
此時(shí),我們的構(gòu)建需要1m55s。
如果我們僅啟用BuildKit而沒有其他更改,會(huì)有什么不同嗎?
BuildKit可以通過兩種方法啟用:
在調(diào)用Docker build命令時(shí)設(shè)置DOCKER_BUILDKIT = 1環(huán)境變量,例如:
time DOCKER_BUILDKIT=1 docker build --no-cache -t docker-class
將Docker BuildKit設(shè)置為默認(rèn)開啟,需要在/etc/docker/daemon.json進(jìn)行如下設(shè)置,然后重啟:
{ "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
此時(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末尾的位置。
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參數(shù),以避免緩存中斷。僅復(fù)制所需內(nèi)容。
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”]
這樣可以防止使用過時(shí)的程序包緩存。
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”]
在開始時(shí),不要安裝調(diào)試和編輯工具,以后可以在需要時(shí)安裝它們。
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”]
你的鏡像不需要此緩存數(shù)據(jù)。借此機(jī)會(huì)釋放一些空間。
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”]
使用官方鏡像有很多理由,例如減少鏡像維護(hù)時(shí)間和減小鏡像尺寸,以及預(yù)先配置鏡像以供容器使用。
FROM openjdk COPY target/my-app-1.0-SNAPSHOT.jar /app CMD [“java”, “-jar”, “/app/my-app-1.0-SNAPSHOT.jar”]
請(qǐng)勿使用latest標(biāo)簽。
FROM openjdk:8 COPY target/my-app-1.0-SNAPSHOT.jar /app CMD [“java”, “-jar”, “/app/my-app-1.0-SNAPSHOT.jar”]
以下是openjdk鏡像列表。選擇最適合自己的最輕的那個(gè)鏡像。
REPOSITORY TAG標(biāo)簽 SIZE大小 openjdk 8 634MB openjdk 8-jre 443MB openjdk 8-jre-slim 204MB openjdk 8-jre-alpine 83MB
如果你不需要整個(gè)JDK,則可以使用Maven Docker鏡像作為構(gòu)建基礎(chǔ)。
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”]
可以緩存–用于獲取依賴項(xiàng)的Dockerfile命令。緩存此步驟將加快構(gòu)建速度。
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”]
為什么要使用多階段構(gòu)建?
將構(gòu)建與運(yùn)行時(shí)環(huán)境分開
DRY方式
具有開發(fā),測(cè)試等環(huán)境的不同詳細(xì)信息
線性化依賴關(guān)系
具有特定于平臺(tái)的階段
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”]
如果你此時(shí)構(gòu)建我們的應(yīng)用程序,
time DOCKER_BUILDKIT=1 docker build --no-cache -t docker-class . 0,41s user 0,54s system 2% cpu 35,656 total
你會(huì)注意到我們的應(yīng)用程序構(gòu)建需要大約35.66秒的時(shí)間。這是一個(gè)令人愉快的進(jìn)步。
下面,我們將介紹其他場(chǎng)景的功能。
下面的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”]
要構(gòu)建特定的鏡像,我們可以使用–target參數(shù):
time docker build --no-cache --target release-jessie .
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命令可以指定要構(gòu)建的鏡像。在上面的例子中,我們指定alpine為默認(rèn)的鏡像,但我們也可以在docker build命令中,通過–build-arg flavor=參數(shù)指定鏡像。
time docker build --no-cache --target release --build-arg flavor=jessie .
并發(fā)在構(gòu)建Docker鏡像時(shí)很重要,因?yàn)樗鼤?huì)充分利用可用的CPU線程。在線性Dockerfile中,所有階段均按順序執(zhí)行。通過多階段構(gòu)建,我們可以讓較小的依賴階段準(zhǔn)備就緒,以供主階段使用它們。
BuildKit甚至帶來了另一個(gè)性能上的好處。如果在以后的構(gòu)建中不使用該階段,則在結(jié)束時(shí)將直接跳過這些階段,而不是對(duì)其進(jìn)行處理和丟棄。
下面是一個(gè)示例Dockerfile,其中網(wǎng)站的資產(chǎn)是在一個(gè)assets階段中構(gòu)建的:
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”]
這是另一個(gè)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具有程序包管理器緩存的特殊功能。以下是一些緩存文件夾位置的示例:
包管理器 路徑
apt /var/lib/apt/lists go ~/.cache/go-build go-modules $GOPATH/pkg/mod npm ~/.npm pip ~/.cache/pip
我們可以將此Dockerfile與上面介紹的在一致的環(huán)境中從源代碼構(gòu)建中介紹的Dockerfile進(jìn)行比較。這個(gè)較早的Dockerfile沒有特殊的緩存處理。我們可以使用–mount=type=cache來做到這一點(diǎn)。
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具有安全功能,下面的示例中,我們使用了–mount=type=secret隱藏了一些機(jī)密文件,例如~/.aws/credentials。
FROM <baseimage> RUN … RUN --mount=type=secret,id=aws,target=/root/.aws/credentials,required \ ./fetch-assets-from-s3.sh RUN ./build-scripts.sh
要構(gòu)建此Dockerfile,需要使用–secret參數(shù):
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
要構(gòu)建此Dockerfile,你需要在ssh-agent中加載到你的SSH私鑰。
eval $(ssh-agent) ssh-add ~/.ssh/id_rsa # this is the SSH key default location docker build --ssh=default .
看完上述內(nèi)容,你們對(duì)BuildKit優(yōu)化Dockerfile的構(gòu)建是怎樣的有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
網(wǎng)站標(biāo)題:BuildKit優(yōu)化Dockerfile的構(gòu)建是怎樣的
本文URL:http://aaarwkj.com/article36/igcgpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網(wǎng)站排名、品牌網(wǎng)站設(shè)計(jì)、、靜態(tài)網(wǎng)站、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
營(yíng)銷型網(wǎng)站建設(shè)知識(shí)