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镜像/