侧边栏壁纸
  • 累计撰写 48 篇文章
  • 累计创建 7 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

【Docker】打包多平台架构镜像

Administrator
2024-09-12 / 0 评论 / 0 点赞 / 3 阅读 / 0 字

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导出二进制文件和优化

查看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 .

注意本地需要有对应名称的不同架构的名称

0

评论区