问题
在mac m1 构建的docker镜像(image:v1.0),在ubuntu上面运行报错:
smart-service | standard_init_linux.go:228: exec user process caused: exec format error
$ uname -m
arm64
由于m1是arm64架构,而ubuntu的是x86_64架构,那有没有可以在mac上面构建x86_64的镜像的方法呢?
解决步骤
在 Docker 19.03+ 版本中可以使用
$ docker buildx build
命令使用 BuildKit 构建镜像。该命令支持 –platform 参数可以同时构建支持多种系统架构的 Docker 镜像。
更多参考:
https://docs.docker.com/engine/reference/commandline/buildx/
Sep1 启用experimental features
Docker 的 buildx 还是实验性功能,需要在 Docker Desktop 设置中开启。
Preferences > Experimental Features > Enable CLI experimental features
Sep2 创建builder
由于 Docker 默认的 builder 实例不支持同时指定多个 –platform,我们必须首先创建一个新的 builder 实例。
$ docker buildx create --use --name my_builder
国内环境使用:
$ docker buildx create --use --name=mybuilder --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master
$ docker buildx create --use --name=mybuilder --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master-baidu
查看实例详情:
docker buildx inspect --bootstrap
output:
$ docker buildx inspect --bootstrap
[+] Building 4.9s (1/1) FINISHED
=> [internal] booting buildkit
=> => starting container buildx_buildkit_my_builder0
Name: my_builder
Driver: docker-container
Nodes:
Name: my_builder0
Endpoint: unix:///var/run/docker.sock
Status: running
Platforms: linux/arm64, linux/amd64, linux/amd64/v2, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
Sep3 构建
使用 $ docker buildx build 命令构建镜像
docker buildx build
–platform linux/amd64,linux/arm64 –push -t myusername:v2.0 .
- –platfrom 不同的架构
- –push 将构建好的镜像推送到 Docker 仓库
构建完 push 上去以后,可以查看远程仓库的 manifest:
docker buildx imagetools inspect myusername:v2.0
output:
$ docker buildx imagetools inspect myusername:v2.0
Name: myusername:v2.0
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
Digest: sha256:c234123456XXXyyyy3a7123456XXXyyyyd28de6c376d2f123456XXXyyyy9edf2
Manifests:
Name: myusername:v2.0 @sha123456XXXyyyy777122
MediaType: application/vnd.docker.distribution.manifest.v2+json
Platform: linux/amd64
Name: myusername:v2.0 @sha123456XXXyyyy777123
MediaType: application/vnd.docker.distribution.manifest.v2+json
Platform: linux/arm64
显示已经支持不同架构
Sep4 测试
在Ubuntu下(v2.0镜像)运行
Status: Downloaded newer image for
myusername:v0.2
Recreating my-service ... done
my-service | INFO msg=[HTTP] server listening on: [::]:8000
正常运行 Succeed
总结
本文主要介绍 使用 buildx 构建多种系统架构支持的 Docker 镜像
参考: