golang在arm64架构打包amd64镜像

环境

macOS: 12.6 (Monterey)
gcc version: Apple clang version 14.0.0 (arm64-apple-darwin21.6.0)

Ubuntu: 16.04.6 LTS
CentOS: Linux release 8.4.2105 (Core)

背景

期望:在k8s上走流水线流程。
过程:需要先依赖golang的镜像,来编译二进制文件,但是由于自己是M2 mac,官方拉去镜像后,打包到私有镜像仓库,然后在dockerfile中编写依赖,这时镜像编译成功,但是无法运行,会报错。

问题

发现了问题就是在 mac M2 上打包镜像,如果不指定架构参数的话,会默认以arm架构打包镜像,最后打包出来的镜像,只能编译在arm机器上。所以这里拉去官方镜像后需要指定架构参数 :--platform=linux/amd64

最开始pull 公共镜像golang1.18

docker pull golang:1.18
# dockefile
FROM --platform=linux/amd64 golang:1.18-alpine3.16
RUN apk --no-cache add tzdata gcc \
    git \
    zlib-dev \
    zstd-libs \
    libsasl \
    lz4-dev \
    zstd-dev \
    libc-dev  && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone
以这个dockerfile为基础镜像,然后在本地打包,push
# arm mac 本地打包

docker build ./ -t [你的私有镜像registry].aliyuncs.com/public/golang:1.18

# 打包完成后推送到私有仓库
docker push [你的私有镜像registry].aliyuncs.com/public/golang:1.18
推送完后,去镜像仓库检查下是否推送成功,然后下一步就是 玩 自己的业务代码dockerfile了,这里举个例子:
FROM  [你的私有镜像registry].aliyuncs.com/public/golang:1.18
ADD netrc /root/.netrc
WORKDIR /build
ADD . /build
RUN GO111MODULE=on GOOS=linux GOARCH=amd64 CGO_ENABLED=1 GOPROXY="https://goproxy.cn,direct" go build -o /bin/main -v -a -ldflags '-w -s' main.go
WORKDIR /bin
ENTRYPOINT [ "coding" ]

然后整体流程就走通了

大家若遇到其他问题,可以留言,我会及时跟进解决方案。

参考

https://github.com/docker/for-mac/issues/6356

https://www.reddit.com/r/docker/comments/ray2wc/running_linuxamd64_images_on_linuxarm64/

总结

这次就是解决了再不同架构平台上打包镜像,然后依赖该镜像,在amd架构上运行的问题。
要多看文档,多查资料,看issue,这样才有具体眉目,希望大家少走弯路。

golang在arm64架构打包amd64镜像
http://blog.darrenzzy.cn/2022/11/02/golang在arm64架构打包amd64镜像/
作者
Darren
发布于
2022年11月2日
许可协议