Mac m芯片的电脑是arm架构
在m1芯片的mbp上打了一个docker镜像,传到linux下运行时出错了,后来排查到是cpu架构差异的问题
解决方案是使用docker buildx 来指定平台
值得一提的是,buildx这玩意儿是在docker版本19.03之后才有。
Docker Buildx
Docker Buildx
是一个CLI插件,扩展了docker命令,并完全支持 Moby BuildKit 构建器工具包提供的功能. 它提供了与 docker build 相同的用户体验,并具有许多新功能,例如:创建范围内的构建器实例和同时针对多个节点进行构建。
安装
直接安装 Docker v19.03 版本,该版本已包含 Docker Buildx 组件,因为目前还是实验功能,默认没有开启。通过设置 DOCKER_CLI_EXPERIMENTAL 环境变量来开启。
1 | $ export DOCKER_CLI_EXPERIMENTAL=enabled |
切换到 docker buildx 构建器
1 | # 创建 mybuilder 构建器 |
构建多平台镜像
创建 Dockerfile
1 | # 使用node镜像,打印一个当前运行平台 |
构成 linux/arm, linux/arm64, linux/amd64 镜像
1 | # 构建前需要配置好推送的镜像仓库,目前构建的镜像不会保存在本地。这里我使用 dockerhub 镜像仓库 |
执行跨平台构建
执行构建命令时,除了指定镜像名称,另外两个重要的选项是指定目标平台和输出格式。
docker buildx build 通过 –platform 选项指定构建的目标平台。Dockerfile 中的 FROM 指令如果没有设置 –platform 标志,就会以目标平台拉取基础镜像,最终生成的镜像也将属于目标平台。此外 Dockerfile 中可通过 BUILDPLATFORM、TARGETPLATFORM、BUILDARCH 和 TARGETARCH 等参数使用该选项的值。当使用 docker-container 驱动时,这个选项可以接受用逗号分隔的多个值作为输入以同时指定多个目标平台,所有平台的构建结果将合并为一个整体的镜像列表作为输出,因此无法直接输出为本地的 docker images 镜像。
docker buildx build 支持丰富的输出行为,通过–output=[PATH,-,type=TYPE[,KEY=VALUE] 选项可以指定构建结果的输出类型和路径等,常用的输出类型有以下几种:
- local:构建结果将以文件系统格式写入 dest 指定的本地路径, 如 –output type=local,dest=./output。
- tar:构建结果将在打包后写入 dest 指定的本地路径。
- oci:构建结果以 OCI 标准镜像格式写入 dest 指定的本地路径。
- docker:构建结果以 Docker 标准镜像格式写入 dest 指定的本地路径或加载到 docker 的镜像库中。同时指定多个目标平台时无法使用该选项。
- image:以镜像或者镜像列表输出,并支持 push=true 选项直接推送到远程仓库,同时指定多个目标平台时可使用该选项。
- registry:type=image,push=true 的精简表示。
对本示例我们执行如下 docker buildx build 命令:
1 | docker buildx build -t demo:0.1 --platform=linux/amd64 -o type=docker,dest=./demo.tar . |
打包完成后,会在当前目录下,生成一个demo.tar ,将demo.tar 上传至目标服务器
$ docker load -i demo.jar
清理docker buildx 缓存
docker buildx prune
本文作者: NUK
最后更新: 2024年11月12日 17:20:39
本文链接: http://www.uilucky.com/post/1ea3e7f6.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可,转载请注明出处!