「Docker Buildx」- 构建“跨平台”镜像(学习笔记) @20210224

问题描述

关于问题背景,参考 Multi-arch build 笔记,这里进行简单概述。

“跨平台镜像”是指什么呢?我们以 nginx:latest 为例,该镜像支持八种架构,如下截图:

pasted_image.png

在 x86 中,执行 docker pull nginx:latest 命令,将返回摘要为 044451886742 的镜像;
在 arm64 中,执行 docker pull nginx:latest 命令,将返回摘要为 4f1e67ed43f3 的镜像;
在 amd64 中,执行 docker pull nginx:latest 命令,将返回摘要为 b08ecc9f7997 的镜像;

使用 Buildx 来构建多架构镜像是非常便捷的方法。

该笔记将记录:如何使用 buildx 构建多平台镜像,以及常见问题处理。

解决方案

Buildx,是 CLI 插件,扩展 docker 命令,支持全部 Moby BuildKit 特性。用法同于 docker build 但又支持很多新特性,比如:
1)创建有范围的构建器实例;
2)针对多节点进行并行构建;

第一步、安装及启用

安装过程如下(详细内容,参考 README.md/Installing 文档)

# 第一步、下载并安装命令

mkdir -pv ~/.docker/cli-plugins/
wget -O ~/.docker/cli-plugins/docker-buildx \
    https://github.com/docker/buildx/releases/download/v0.5.1/buildx-v0.5.1.linux-amd64
chmod a+x ~/.docker/cli-plugins/docker-buildx 

# 第二步、设置 experimental 参数

vim ~/.docker/config.json
{
    ...
    "experimental": "enabled",
    ...
}

安装 docker buildx 为默认构建命令。而后,执行 docker build 等同于 docker buildx 命令:

docker buildx install
docker buildx uninstall # 卸载

使用 Buildx 命令,以构建镜像

有两种驱动:docker 与 docker-container(但是两者也有部分不同):
1)docker,使用绑定到 dockerd 的 BuildKit 工具;
2)docker-container,使用容器运行 BuildKit 工具;

使用构建实例,以使用不同节点来构建镜像

通过多构建实例,可以自由切换实例,然后子不同主机上执行构建任务。

使用多平台构建,以构建多个平台的镜像

可以构建多个平台镜像。

高级构建选项

通过 docker bake 命令,可以并行构建多个镜像。

应用案例:构建多平台镜像(基础案例)

正如文章开始处的问题,该案例也是我们要完成的事情。

简单案例

如下示例,只是为了让我们明白使用 buildx 的大致流程:

# 获取我们要构建的镜像
git clone https://github.com/kstaken/dockerfile-examples.git
cd dockerfile-examples/rethinkdb

# 创建构建实例。通俗的讲,就是创建用于构建的节点
docker buildx create --use --name build --node build --driver-opt network=host

# 执行构建命令。
docker buildx build \
    --tag 0xa0000/buildx-example:latest \
    --platform linux/amd64,linux/arm64 .

# 如果使用 --push 选项,那么在构建完成之后,会立即推送镜像仓库
docker buildx build --push \
    --tag 0xa0000/buildx-example:latest \
    --platform linux/amd64,linux/arm64 .

复杂案例

docker buildx create --name multi-platform --use \
    --platform linux/amd64 \
    --driver docker-container "build-node-amd64"
    
docker buildx create --name multi-platform --append \
    --platform linux/arm64 \
    --driver docker-container "build-node-arm64"
    
docker buildx build --progress plain --output "type=image,push=false"  \
    --file "/data/cita-monitor/agent/cita_exporter/Dockerfile" \
    --tag citamon/agent-cita-exporter:20.2.2     \
    --platform linux/arm64,linux/amd64 \
    /data/cita-monitor/agent/cita_exporter

常见问题汇总

auto-push is currently not implemented for docker driver

buildx: auto-push is currently not implemented for docker driver · Issue #4991 · docker/for-win

问题描述:执行 docker buildx 时产生如下错误:

# docker buildx build --push \
    --platform linux/arm/v7,linux/arm64/v8,linux/amd64 \
    --tag your-username/multiarch-example:buildx-latest \
    ./
auto-push is currently not implemented for docker driver

问题原因:在使用多平台构建时,需要先创建构建实例

解决方法:docker buildx create --use --name build --node build --driver-opt network=host

multiple platforms feature is currently not supported for docker driver

在执行 docker buildx build 命令时,产生如下错误:

# docker buildx build \
>     --tag 0xa0000/buildx-example:latest \
>     --platform linux/amd64,linux/arm64 .
[+] Building 0.0s (0/0)
error: multiple platforms feature is currently not supported for docker driver. Please switch to a different driver (eg. "docker buildx create --use")

Cannot autolaunch D-Bus without X11 $DISPLAY

docker login fails while docker-compose is installed on Ubuntu 18.04 · Issue #6023 · docker/compose

问题原因:在 config.json 中,我们使用未受系统支持的凭证存储方式。该方式将链接 D-Bus 服务,进而导致该错误。

解决方案:去掉 ~/.docker/config.json 的 "credsStore": "secretservice" 配置

unable to upgrade to tcp, received 200

相关链接

平台字段的命名规范(platform)

The formatting for the platform specifier is defined in
https://github.com/containerd/containerd/blob/v1.2.6/platforms/platforms.go#L63

关于 docker buildx 命令手册

docker buildx | Docker Documentation

相关文章

「Docker」- 构建“跨平台”镜像、多平台镜像(Multi-Arch Images)

参考文献

Docker Buildx | Docker Documentation
docker buildx build | Docker Documentation

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值