跳到主要内容

docker多架构镜像构建

安装docker buildx

安装命令:

mkdir -p $HOME/.docker/cli-plugins
wget https://github.com/docker/buildx/releases/download/v0.12.0/buildx-v0.12.0.linux-amd64 -O $HOME/.docker/cli-plugins/docker-buildx
chmod +x $HOME/.docker/cli-plugins/docker-buildx

查看插件版本:

docker buildx version

查看当前系统中 Docker Buildx 支持使用的架构

docker buildx ls 

结果如下:可以看到默认是default,并且不支持arm架构

default * docker                                                        default         running v0.11.7-0.20230525183624-798ad6b0ce9f linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/386

安装二进制文件格式解释器:

docker run --privileged --rm tonistiigi/binfmt --install all

此时再去查看架构支持:

[root@localhost ~]# docker buildx ls 
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
default * docker
default default running v0.11.7-0.20230525183624-798ad6b0ce9f linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6

创建新的构建实例:

使用 docker-container 驱动程序创建一个新的构建器,它可以让您访问更复杂的功能,比如多平台构建和更高级的缓存导出功能。这些功能在默认的 docker 驱动程序中目前不受支持。

docker buildx create --name mybuilder --bootstrap --use

构建多架构镜像

编写Dockerfile:

FROM dockerpull.org/eclipse-temurin:8u392-b08-jdk-jammy

# 如果容器需要操作宿主机docker
RUN apt-get update && apt-get install -y libltdl7

# 将当前目录下的 java.security 文件复制到容器中指定路径
COPY java.security /opt/java/openjdk/jre/lib/security/java.security

使用 Buildx 插件构建镜像:

docker buildx build --platform=linux/arm64,linux/amd64 -t 192.168.51.52:8082/casll/jdk8 --push .

遇到问题:

ERROR: failed to solve: failed to push 192.168.51.52:8082/casll/jdk8: failed to do request: Head "https://192.168.51.52:8082/v2/casll/jdk8/blobs/sha256:bb699589ec711474bb920a23601539265a47d38d3f6ca3e52cf61f5bf3143376": http: server gave HTTP response to HTTPS client

解决办法:https://github.com/docker/buildx/issues/163

配置文件:

# 配置私有仓库
[registry."192.168.51.52:8082"]
http = true
insecure = true

# 配置 docker.io 的代理为 dockerpull.org
[registry."docker.io"]
# mirrors = ["dockerpull.org"]
http = false # 如果 dockerpull.org 使用 HTTPS,请确保设为 false
insecure = false # 假设 dockerpull.org 使用 HTTPS

重新构建一个工具

docker buildx create --name mybuilder  --config ./buildkitd.toml --bootstrap --use

此时再去构建了往自己的私有仓库harbor推送:

docker buildx build --platform=linux/arm64,linux/amd64 -t 192.168.51.52:8082/casll/jdk8 --push .

参考文档

使用 Docker 构建多架构镜像