Windows平台打包
安装Docker Desktop docs.docker.com
docker build -f ./build/docker/Dockerfile --platform=linux/arm64,linux/amd64 -t csop:latest .
该命令将同时打出arm和amd镜像
Linux
参考:https://docs.docker.com/build/guide/multi-platform/
vim /etc/docker/daemon.json
添加以下内容
{
"experimental": true, //低版本docker时需要添加此行
"features": {
"containerd-snapshotters": true
}
}
重启docker服务
systemctl daemon-reload
systemctl restart docker.service
安装模拟器
apt-get install qemu qemu-user-static binfmt-support
老版本docker中,如果Dockerfile from的镜像已经在amd机器上存在,则不会去下载arm64镜像,打包出的镜像是amd64的。需要先下载对应平台的基础镜像,再使用docker build --platform=linux/arm64
Golang使用Docker打包多平台
查看docker buildx支持的多平台
docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
default* docker
\_ default \_ default running v0.13.2 linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
desktop-linux docker
\_ desktop-linux \_ desktop-linux running v0.13.2 linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
拉取mipse64版本golang镜像(科学上网)
docker pull golang:1.23.0 --platform=linux/mips64le
支付loong64架构
创建一个新的 buildx
实例,并添加 loong64 架构支持:
docker buildx create --name gjing1st --platform linux/amd64,linux/arm64,linux/loong64,linux/mips64le
切换到刚刚创建的 buildx
实例:
docker buildx use gjing1st
验证 buildx
实例是否已经支持 loong64 架构:
docker buildx inspect --bootstrap
输出结果应该包含 linux/loong64
架构:
第一次执行
root@DESKTOP-BB0KRFQ:~# docker buildx inspect --bootstrap
[+] Building 37.1s (1/1) FINISHED
=> [internal] booting buildkit 37.1s
=> => pulling image moby/buildkit:buildx-stable-1 35.4s
=> => creating container buildx_buildkit_gjing1st0 1.7s
Name: gjing1st
Driver: docker-container
Last Activity: 2024-08-22 06:43:42 +0000 UTC
Nodes:
Name: gjing1st0
Endpoint: unix:///var/run/docker.sock
Error: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.45/containers/buildx_buildkit_gjing1st0/json": context deadline exceeded
再次执行:
root@DESKTOP-BB0KRFQ:~# docker buildx inspect --bootstrap
Name: gjing1st
Driver: docker-container
Last Activity: 2024-08-22 06:43:42 +0000 UTC
Nodes:
Name: gjing1st0
Endpoint: unix:///var/run/docker.sock
Status: running
BuildKit daemon flags: --allow-insecure-entitlement=network.host
BuildKit version: v0.15.2
Platforms: linux/amd64*, linux/arm64*, linux/loong64*, linux/mips64le*, linux/amd64/v2, linux/amd64/v3, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64, linux/arm/v7, linux/arm/v6
Labels:
org.mobyproject.buildkit.worker.executor: oci
org.mobyproject.buildkit.worker.hostname: aedd07cd954c
org.mobyproject.buildkit.worker.network: host
org.mobyproject.buildkit.worker.oci.process-mode: sandbox
org.mobyproject.buildkit.worker.selinux.enabled: false
org.mobyproject.buildkit.worker.snapshotter: overlayfs
GC Policy rule#0:
All: false
Filters: type==source.local,type==exec.cachemount,type==source.git.checkout
Keep Duration: 48h0m0s
Keep Bytes: 488.3MiB
GC Policy rule#1:
All: false
Keep Duration: 1440h0m0s
Keep Bytes: 94.06GiB
GC Policy rule#2:
All: false
Keep Bytes: 94.06GiB
GC Policy rule#3:
All: true
Keep Bytes: 94.06GiB
上述配置后使用loong64打包依然报错
root@DESKTOP-BB0KRFQ:~# docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
gjing1st docker-container
\_ gjing1st0 \_ unix:///var/run/docker.sock inactive linux/amd64*, linux/arm64*, linux/loong64*, linux/mips64le*
default* docker
\_ default \_ default running v0.13.2 linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
desktop-linux error
Cannot load builder desktop-linux: protocol not available
root@DESKTOP-BB0KRFQ:~#
切换buildx
实例后通过 docker buildx ls可以看到*变了
root@DESKTOP-BB0KRFQ:~# docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
gjing1st* docker-container
\_ gjing1st0 \_ unix:///var/run/docker.sock inactive linux/amd64*, linux/arm64*, linux/loong64*, linux/mips64le*
default docker
\_ default \_ default running v0.13.2 linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
desktop-linux error
Cannot load builder desktop-linux: protocol not available
loong64暂未实现
打包多平台
以下默认打包arm64
# syntax=docker/dockerfile:1
ARG PLATFORM=arm64
ARG ALPINE_VERSION=3.20
ARG GO_VERSION=1.23.0
# 多阶段构建
#构建一个 builder 镜像,目的是在其中编译出可执行文件mck
#构建时需要将此文件放到代码根目录下
FROM gjing1st/golang-${PLATFORM}:${GO_VERSION}-alpine${ALPINE_VERSION} as builder
WORKDIR /build/src
ENV CGO_ENABLED=0
ENV GOPROXY=https://goproxy.cn,direct
#使用缓存加速构建
RUN --mount=type=cache,target=/go/pkg/mod/ \
--mount=type=bind,source=go.sum,target=go.sum \
--mount=type=bind,source=go.mod,target=go.mod \
go mod download -x
#将上层整个文件夹拷贝到/build
ADD . /build/src
#COPY --from=builder /build/src/config/config.yml /app/config/config.yml
#去掉了调试信息 -ldflags="-s -w" 以减小镜像尺寸
RUN go build -ldflags="-s -w" -o statistic ./cmd/statistic/main.go
FROM gjing1st/alpine-${PLATFORM}:${ALPINE_VERSION}
##更新软件源
#RUN apk update --no-cache && apk add --no-cache tzdata
##设置本地时区,这样我们在日志里看到的是北京时间了
#ENV TZ Asia/Shanghai
WORKDIR /home
COPY --from=builder /build/src/statistic /home/statistic
CMD ["./statistic"]
EXPOSE 9681
# docker build --build-arg PLATFORM=arm64 -t statistic:v4.0.0 .
开始构建:
#打包arm
docker build --build-arg PLATFORM=arm64 --platform=linux/arm64 -t upserver:v4.0.0 .
# 打包amd
docker build --build-arg PLATFORM=amd64 --platform=linux/arm64 -t upserver:v4.0.0 .
# 打包mipse
docker build --build-arg PLATFORM=mipse64le --platform=linux/arm64 -t upserver:v4.0.0 .
注意本地需要有对应名称的不同架构的名称
评论区