當前位置: 妍妍網 > 碼農

容器映像構建神器 Buildx,支持多平台

2024-04-25碼農

原文連結:https://www.baeldung.com/ops/docker-buildx

一、簡介

Docker 是一種流行的部署工具,使我們能夠打包和執行應用程式。由於采用率很高,因此需要根據不同的要求擴充套件功能。因此,為了實作這一點,可以使用第三方 docker 外掛程式 [1]

例如,如果希望數據跨不同主機持久化數據,可以使用卷外掛程式。另一個常用的外掛程式是 Docker buildx [2] 。它透過使用 BuildKit builder 擴充套件了映像的構建能力。因此,使用該外掛程式,我們可以為不同的平台和架構構建映像。此外,它支持使用自訂上下文進行並列多階段制作。

在本教程中,我們將介紹 Docker buildx。

2.安裝 buildx

首先,要執行 buildx ,我們需要安裝 Docker。對 Docker buildx 的支持從 19.00 開始可用。

首先檢查 Docker 版本:

$ docker --version
Docker version 19.03.8, build afacb8b

接下來,透過設定環境變量啟用 Docker 實驗性功能:

export DOCKER_CLI_EXPERIMENTAL=enabled

為了確保我們的設定在會話結束後仍然存在,我們將變量添加到 $HOME/.bashrc ,現在應該可以存取 buildx:

$ docker buildx
Usage: docker buildx COMMAND
Build with BuildKit
Management Commands:
imagetools Commands to work on images in registry
Commands:
bake Build from a file
build Start a build
create Create a new builder instance
inspect Inspect current builder instance
ls List builder instances
rm Remove a builder instance
stop Stop builder instance
use Set the current builder instance
version Show buildx version information
Run 'docker buildx COMMAND --help'for more information on a command.



這顯示了常用命令和每個命令的語法。

3.使用 buildx 構建

buildx 執行所有 Docker 構建 [3] 功能。因此,可以輕松地執行並執行它們。例如,指定目標平台、構建緩存和輸出配置。除此之外, buildx 還提供了額外的功能。

首先是同時為多個平台構建映像的能力。其次,在單個 dockerfile 中為較小的映像進行多階段構建。最後,在構建過程中自訂輸入、參數或變量的能力。

讓我們透過建立一個例項來深入研究一個例子:

$ docker buildx create --name ourbuilder
ourbuilder

這將建立一個名為 ourbuilder 的構建例項。

接下來,將其設定為Active Directory:

$ docker buildx use ourbuilder

接下來,建立一個 dockerfile 來執行一個簡單的 node 應用程式:

# Base image
FROM node:14-alpine
# Set working directory
WORKDIR /app
# Copy application files
COPY . .
# Install dependencies
RUN npm install --production
# Expose the port
EXPOSE 3000
# Start the application
CMD ["node""app.js"]



這裏使用 node.js 基礎映像並將工作目錄設定為/app。然後將應用程式檔復制到容器中。然後安裝所有依賴項,暴露埠 3000 並啟動應用程式:

$ docker buildx build --platform linux/amd64,linux/arm64 -t ourapp:latest .
time="2023-06-01T07:13:20+03:00" level=warning msg="No output specified for docker-container driver.
Build result will only remain in the build cache. To push result image into registry use --push or to load image into docker use --load"

#1 [internal] booting buildkit
#1 pulling image moby/buildkit:buildx-stable-1
#1 pulling image moby/buildkit:buildx-stable-1 73.2s done
#1 creating container buildx_buildkit_ourbuilder0
#1 creating container buildx_buildkit_ourbuilder0 2.1s done
#1 DONE 75.4s
#3 [internal] load .dockerignore
#3 transferring context: 0.0s
#3 transferring context: 2B 0.1s done
#3 DONE 0.3s
#2 [internal] load build definition from Dockerfile
#2 transferring dockerfile: 294B 0.0s done
#2 DONE 0.4s
#4 [linux/amd64 internal] load metadata for docker.io/library/node:14-alpin...
#4 DONE 4.7s
.... truncated .....

使用 –platform 標誌指定目標平台。在這種情況下,目標是 x86 (Linux/amd64) 和 ARM (Linux/arm64) 架構。我們還提供了標簽 -t ourapp:latest 以使用名稱 ourapp 和 latest 標簽來標記構建的映像。指定構建上下文,即當前目錄。

Docker buildx auto 處理多平台構建並為每個目標架構生成單獨的映像。

4、結論

在本教程中,我們探索了 Docker buildx,這是一種擴充套件 Docker 映像構建和管理能力的工具。它透過支持並列構建、自訂構建上下文和多階段構建來簡化流程。

往期推薦


點亮,伺服器三年不宕機