制作多架构镜像
大约 2 分钟
方式一、使用buildx
- 多架构Go程序目录
# 文件目录
# bin目录是go程序编译结果 go build GOOS=linx GOARCH=amd64 \ GOARCH=arm64
.
├── Dockerfile
├── README.md
├── bin
│ ├── amd64
│ │ └── tool
│ └── arm64
│ └── tool
├── golang
│ ├── go.mod
│ └── main.go
└── sh
└── start.sh
- Dockerfile编写
# 基础架构就是支持多架构的 https://hub.docker.com/_/alpine/tags
FROM --platform=$TARGETPLATFORM alpine:3.18.4
WORKDIR /app
ARG TARGETPLATFORM
ARG TARGETARCH
# 将对应架构的go程序放在app目录
COPY bin/$TARGETARCH/* /app
# 镜像启动脚本
COPY sh/start.sh /app
RUN chmod +x /app/start.sh
# ENTRYPOINT无法被覆盖,CMD可以被覆盖,使用CMD是为了方便helm包安装镜像时候更改启动指令
CMD ["/bin/sh","/app/start.sh"]
- 开启Docker的buildkit
# docker配置文件如下
/root/.docker/config.json
/etc/docker/daemon.json
- 执行命令制作多架构镜像
# 创建一个新的 buildx 构建器,并将其设置为当前正在使用的构建器
# 以便在运行 Docker 构建命令时可以使用该构建器进行构建
# 通过 network=host 指定共享主机网络
$ docker buildx create --name builder --config /etc/buildkit/buildkitd.toml \
--platform linux/arm64,linux/amd64 \
--append --driver-opt network=host --use
# 开始构建
$ docker buildx build -t registry.my.net/develop/tool:v0.0.1 --platform=linux/arm64,linux/amd64 . --push
方式二、使用manifest创建清单
# 先制作镜像
$ docker images
- registry.my.net/bingokube/etcd:v3.5.0-amd64
- registry.my.net/bingokube/etcd:v3.5.0-arm64
# 制作清单
$ docker manifest create --insecure registry.my.net/bingokube/etcd:v3.5.0 \
registry.my.net/bingokube/etcd:v3.5.0-amd64 \
registry.my.net/bingokube/etcd:v3.5.0-arm64
# 推送清单
$ docker manifest push --insecure registry.my.net/bingokube/etcd:v3.5.0
# 查看清单
$ docker manifest inspect registry.my.net/bingokube/etcd:v3.5.0
{
"schemaVersion": 2,
"mediaType": "application/xxx.list.v2+json",
"manifests": [
{
"mediaType": "application/xxx.v2+json",
"size": 1783,
"digest": "sha256:abc",
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
{
"mediaType": "application/xxx.v2+json",
"size": 1576,
"digest": "sha256:abc",
"platform": {
"architecture": "arm64",
"os": "linux"
}
}
]
}
常见问题
私有库ssl验证 (
docker login my.net
),配置文件/root/.docker/config.json
{ "auths": { "registry.my.net": { "auth": "xxx" } } }
绕过私有库ssl验证(experimental是开启实验功能,buildkit开启多架构功能),配置文件
/etc/docker/daemon.json
{ "insecure-registries" : [ "registry.my.net" ], "experimental": true, "features": { "buildkit": true } }
docker buildx绕过ssl验证,配置文件
/etc/buildkit/buildkitd.toml
[registry."registry.my.net"] http = true insecure = true