简介
本文介绍了如何使用 Docker Buildx 一次性构建不同平台架构的 Docker 镜像,并上传到 Docker Hub。通过简单的准备工作和构建脚本,我们可以轻松地实现跨平台的镜像构建和发布。
准备工作
系统版本
root@example:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.4 LTS
Release: 22.04
Codename: jammy
root@example:~# uname -a
Linux example 6.5.0-26-generic #26~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Mar 12 10:22:43 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
docker环境
docker安装请参考阿里巴巴开源镜像站
root@example:~# docker version
Client: Docker Engine - Community
Version: 26.0.0
API version: 1.45
Go version: go1.21.8
Git commit: 2ae903e
Built: Wed Mar 20 15:17:48 2024
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 26.0.0
API version: 1.45 (minimum version 1.24)
Go version: go1.21.8
Git commit: 8b79278
Built: Wed Mar 20 15:17:48 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.28
GitCommit: ae07eda36dd25f8a1b98dfbf587313b99c0190bb
runc:
Version: 1.1.12
GitCommit: v1.1.12-0-g51d5e94
docker-init:
Version: 0.19.0
GitCommit: de40ad0
在开始之前,确保你的系统已经安装了以下工具:
qemu-user-static
:用于在当前操作系统上运行其他架构的仿真器。binfmt-support
:用于解析不同系统的二进制文件,给内核执行,并返回执行结果给用户空间的进程。 你可以使用以下命令安装这些工具:
sudo apt install binfmt-support qemu-user-static
配置 Docker Buildx
首先,创建一个 Docker Buildx 构建器并启用:
sudo docker buildx create --name mybuilder
sudo docker buildx use mybuilder
sudo docker buildx inspect --bootstrap
编写 Go 程序
在开始构建之前,我们先编写一个简单的 Go 程序 main.go
,内容如下:
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Println("Hello, Docker! Platform architecture:", runtime.GOARCH)
}
编写 Dockerfile
然后,编写 Dockerfile 用于构建 Go 程序的镜像:
FROM golang:1.17 AS builder
# 设置工作目录
WORKDIR /app
# 复制源代码到工作目录
COPY . .
# 编译可执行文件
RUN go mod init goDemo && go mod tidy && go build -o app .
准备构建脚本
编写一个构建脚本 build.sh
,用于自动化构建不同平台架构的 Docker 镜像并推送到 Docker Hub:
#!/bin/bash
# 设置镜像仓库名称和标签
REPO="adcwb/builds"
TAG="latest"
# 获取所有平台架构
PLATFORMS=$(sudo docker buildx ls | grep -oP '\blinux/\w+\b' | sort | uniq)
# 遍历所有平台架构并构建镜像
for platform in $PLATFORMS; do
echo "Building image for platform: $platform"
sudo docker buildx build -t ${REPO}:$(echo $platform | sed 's/\//-/g')-${TAG} --platform $platform . --push
done
Docker Buildx 是 Docker 的一个构建工具,它提供了一种更灵活和高效的方式来构建、打包和发布多平台架构的 Docker 镜像。以下是 Docker Buildx 的一些常用参数介绍:
--platform
:指定目标平台架构,可以是单个平台或多个平台的逗号分隔列表。例如:--platform linux/amd64,linux/arm64
--builder
:指定使用的构建器名称,可以是预先创建的构建器的名称。例如:--builder mybuilder
--file
:指定 Dockerfile 的路径。默认为当前目录下的 Dockerfile。--tag
:指定镜像的标签。例如:--tag myimage:latest
。--build-arg
:传递构建参数给 Dockerfile。例如:--build-arg VAR_NAME=value
。--output
:指定输出格式。例如:--output type=image,push=true
。--progress
:设置构建过程中的输出进度格式。例如:--progress plain
。--load
:将构建的镜像导出到本地文件中。--push
:将构建的镜像推送到镜像仓库。--no-cache
:禁用构建缓存。--allow
:设置构建策略,允许或拒绝某些操作。例如:--allow=all
。
运行构建脚本
运行构建脚本即可开始构建不同平台架构的 Docker 镜像并推送到 Docker Hub:
注意:如需把镜像推送到现有仓库中,需要先进行登录
bash build.sh
构建过程如下所示,仅展示部分输出日志
查看构建结果
在 Docker Hub 上查看构建完成的镜像,并确认不同平台架构的镜像已经上传成功。
在其他系统上随机拉取镜像测试执行
$ sudo docker run --rm -it --platform linux/arm64 adcwb/builds:linux-arm64-latest
Hello, Docker! Platform architecture: arm64