在容器化領域,效率、速度和簡單性至關重要,Buildpack 已成為一種強大的工具,可以徹底改變項目創建 Docker 鏡像的過程。與需要費力創建和維護 Dockerfile 的傳統方法不同,Buildpack 提供了簡化且自動化的解決方案。使用 Buildpack,我們可以輕松構建 Docker 鏡像,無論項目數量多少。接下來,我們將深入探討下 Buildpack 。
Buildpack 是一個方便的工具,可以為項目快速創建 Docker 鏡像,而無需單獨的Dockerfiles。因此,你可以高效地 Dockerize 多個項目,而無需為每個項目編寫Dockerfile 。Buildpack 會自動檢測項目的編程語言和必要的依賴項,例如pom.xml、build.gradle或requirements.txt文件,只需運行一個簡單的命令,即可輕松將項目集成到 CI/CD 管道中以自動創建 Docker 鏡像。
使用 Buildpack 比使用 Dockerfile 要容易得多,因為使用 Buildpack 時,你不需要編寫Dockerfile,只需運行一個簡單的命令即可為項目創建 Docker 鏡像。Buildpack的另一個優點是多階段的處理。當我們為項目編寫 Dockerfile 時,必須創建一個多階段 Dockerfile,其中一個階段用于構建(例如,對于使用 Maven 或 Gradle 的Java項目),另一個階段用于運行(運行應用程序所需的依賴項)。例如,運行 Java 應用程序只需要 JRE,而不需要 Maven/Gradle 或其他構建工具。
如果你希望創建一個高效的 Java/Spring Boot/Maven Dockerfile 項目,你需要制作一個兩階段的 Dockerfile,第一階段build stage,第二階段run stage:
####################### build stage #######################FROM openjdk:8u342-slim-buster RUN apt update & apt install -y curl tar bash ca-certificates gnupgENV NODE_MAJOR=16RUN mkdir -p /etc/apt/keyrings && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.listRUN apt update && apt install nodejs -yARG MAVEN_VERSION=3.6.3ARG BASE_URL=https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binariesRUN mkdir -p /usr/share/maven /usr/share/maven/ref / && echo "Downlaoding maven" / && curl -fsSL -o /tmp/apache-maven.tar.gz ${BASE_URL}/apache-maven-${MAVEN_VERSION}-bin.tar.gz / && echo "Unziping maven" / && tar -xzf /tmp/apache-maven.tar.gz -C /usr/share/maven --strip-components=1 / && echo "Cleaning and setting links" / && ln -s /usr/share/maven/bin/mvn /usr/bin/mvnWORKDIR /workspaceADD . /workspace RUN mvn clean packageRUN mv target/*.jar target/app.jar####################### run stage #######################FROM openjdk:8u342-slim-buster WORKDIR /workspaceCOPY --from=0 /workspace/target/app.jar .ENTRYPOINT ["java", "-jar", "app.jar"]
上面的Dockerfile內容相當復雜,你需要了解 Docker 中多階段的概念才能理解其中發生的事情。然而,Buildpack 可以讓它變得簡單,并且會以不同的方式生成 Docker 鏡像。
左邊Buildpack,右邊Dockerfile
使用 Buildpack 的情況包括:
1. 沒有源代碼倉庫的寫權限,但項目構建時需要Dockerfile。如果無法訪問源代碼倉庫的寫權限,可以使用一個工具在運行時生成Dockerfile并構建Docker鏡像,而無需暴露實際的Dockerfile。這樣可以簡化流程。
2. 如果源代碼倉庫中包含多種編程語言的代碼,最好不要使用Buildpack,因為可能需要進行大量的定制來指示項目是用多種語言編寫的。
3. 使用Buildpack非常簡單和直接,當你想要節省時間和精力時,它是一個極好的選擇!
安裝 Buildpack 非常簡單,可以從其 GitHub 版本頁面下載并安裝:https://github.com/buildpacks/pack。
$ wget https://github.com/buildpacks/pack/releases/download/v0.31.0/pack-v0.31.0-linux.tgz$ tar -xvzf pack-v0.31.0-linux.tgz$ sudo mv pack /usr/bin/
示例如下:
$ git clone https://github.com/paketo-buildpacks/samples$ cd samples/java/gradle$ pack build testjavadocker --env BP_JVM_VERSION=17$ docker run --rm testjavadocker
$ pack build test --builder=buildpacks/builder-jammy-base:0.1.0...===> ANALYZINGImage with name "test" not found===> DETECTING======== Output: paketo-buildpacks/leiningen@4.5.1 ========runtime/cgo: pthread_create failed: Operation not permittedSIGABRT: abortPC=0x7f8c2afb8a7c m=0 sigcode=18446744073709551610goroutine 0 [idle]:runtime: unknown pc 0x7f8c2afb8a7cstack: frame={sp:0x7fffb88316a0, fp:0x0} stack=[0x7fffb8032bf8,0x7fffb8831c30)0x00007fffb88315a0: 0x00007f8c2b13c723 0x00007f8c2b13c723
$ mvn wrapper:wrapper -Dmaven=3.6.3$ ./mvnw clean package
pack build test / --env 'BP_JVM_VERSION=8' / --env 'BP_MAVEN_BUILD_ARGUMENTS=clean package install -U' / --env 'BP_NODE_VERSION=16.20.0' / --env 'BP_JAVA_INSTALL_NODE=true' / --env 'BP_NODE_PROJECT_PATH=src/main/frontend' --builder=buildpacks/builder-jammy-base:0.1.0
在容器化時代,Buildpack 作為一種改變游戲規則的工具出現,可以簡化為項目制作 Docker 鏡像的過程。它提供了一種自動化且高效的方法,消除傳統 Dockerfile 創建和維護的復雜性。憑借其能夠輕松構建 Docker 鏡像且無需 Dockerfile 的能力,使開發人員能夠無縫處理多個項目。它擅長識別項目的編程語言和結構,允許自動創建 Docker 鏡像,并將其無縫集成到 CI/CD 管道中。趕緊試試吧!
本文鏈接:http://www.tebozhan.com/showinfo-26-15182-0.html是時候放棄Dockerfile了,考慮上手Buildpack吧
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com