docker buildx 构建多种系统架构
最后更新于:2022-04-02 03:04:00
[TOC]
> [参考](https://www.bookstack.cn/read/docker_practice-1.2.0/buildx-multi-arch-images.md)
## docker buildx
- 使用 buildx 构建多种系统架构支持的 Docker 镜像
- `--platform` 参数可以同时构建支持多种系统架构的 Docker 镜像,大大简化了构建步骤
### 兼容
Docker for Linux 不支持构建 arm 架构镜像,可以运行一个新的容器让其支持该特性(Docker 桌面版无需进行此项设置)
```
docker run --rm --privileged tonistiigi/binfmt:latest --install all
```
### 创建新的builder实例
- 由于 Docker 默认的 builder 实例不支持同时指定多个 --platform
- 我们必须首先创建一个新的 builder 实例
```
# 适用于国内环境
$ docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master
# 适用于腾讯云环境(腾讯云主机、coding.net 持续集成)
$ docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master-tencent
# $ docker buildx create --name mybuilder --driver docker-container
$ docker buildx use mybuilder
```
## 示例
### 构建镜像
Dokcerfile
```
FROM --platform=$TARGETPLATFORM alpine
RUN uname -a > /os.txt
CMD cat /os.txt
```
构建
- 注意将 myusername 替换为自己的 Docker Hub 用户名
- --push 参数表示将构建好的镜像推送到 Docker 仓库
```
$ docker buildx build --platform linux/arm,linux/arm64,linux/amd64 -t myusername/hello . --push
# 查看镜像信息
$ docker buildx imagetools inspect myusername/hello
```
在不同架构运行该镜像,可以得到该架构的信息
```
# arm
$ docker run -it --rm myusername/hello
Linux buildkitsandbox 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 armv7l Linux
# arm64
$ docker run -it --rm myusername/hello
Linux buildkitsandbox 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 aarch64 Linux
# amd64
$ docker run -it --rm myusername/hello
Linux buildkitsandbox 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 Linux
```
';