在 Docker 19.03+ 版本中可以使用 docker buildx build
命令使用 BuildKit
构建镜像。该命令支持 --platform
参数可以同时构建支持多种系统架构的 Docker 镜像,大大简化了构建步骤。
安装模拟器
Docker for Linux 不支持构建 arm
架构镜像,我们可以运行一个新的容器让其支持该特性,Docker 桌面版无需进行此项设置。
docker run --rm --privileged tonistiigi/binfmt:latest --install all
新建 builder 实例
由于 Docker 默认的 builder
实例不支持同时指定多个 --platform
,所以必须先创建一个新的 builder
实例。同时由于国内拉取镜像较缓慢,我们可以使用配置了 镜像加速地址 的 dockerpracticesig/buildkit:master 镜像替换官方镜像。
# 适用于国内环境 | |
docker buildx create --use --name=mybuilder --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master | |
# 官方默认 | |
docker buildx create --name mybuilder --driver docker-container |
上面新建了一个名为 mybuilder
的实例,可以使用 docker buildx ls
查看
使用新创建好的 builder 实例
docker buildx use mybuilder
新建 Dockerfile 文件
以下是一个示例的 Dockerfile 文件,用于构建自定义 Nginx 容器镜像:
FROM --platform=$TARGETPLATFORM nginx | |
LABEL org.opencontainers.image.authors="Kinoko" | |
RUN apt update \ | |
&& apt install cron -y \ | |
&& curl https://get.acme.sh | sh -s [email protected] \ | |
&& ln -s /root/.acme.sh/acme.sh /usr/bin/acme.sh \ | |
&& chmod +x /usr/bin/acme.sh \ | |
&& acme.sh --upgrade --auto-upgrade | |
EXPOSE 80 443 | |
USER root |
$TARGETPLATFORM
是内置变量,由 --platform
参数来指定其值。
由于是基于 nginx 镜像制作,nginx支持以下7种系统架构,因此我们制作的镜像也就跟着支持这 7 种系统架构。
linux/386,linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7,linux/ppc64le,linux/s390x
如果基础镜像来源于不同的镜像,可以先将不同的基础镜像进行重命名,使用统一的前缀和不同的 tag 来区分,然后在 Dockerfile 中使用变量
TARGETARCH
来选择不同的基础镜像。
构建镜像
使用 docker buildx build
命令构建镜像,注意将 myusername
替换为自己的 Docker Hub 用户名。$TARGETPLATFORM
是内置变量,由 --platform
参数来指定其值。
docker buildx build --platform linux/386,linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7,linux/ppc64le,linux/s390x -t myusername/nginx:tag . --push | |
docker buildx imagetools inspect myusername/nginx:tag |
--push
会将构建好的镜像推送到镜像仓库
--load
会将构建好的镜像load到本地,不支持多镜像一起使用,需要分开构建