Linux 平台信息
下面简单列举一些
- linux/amd64 目前最主流的 X86_64
- linux/arm64
- linux/arm
- linux/arm/v6
- linux/arm/v7
问题
Linux 有很多平台,有没有办法只构建一次就能构建出所有的平台镜像?答案是有的,下面介绍的工具刚好能解决这个问题。
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
2
3
4
5
6
7
8
9
10
11# 使用node镜像,打印一个当前运行平台
$ vim Dockerfile
FROM --platform=$BUILDPLATFORM node:alpine AS build
ARG TARGETPLATFORM
ARG BUILDPLATFORM
RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" > /log
FROM alpine
COPY --from=build /log /log
CMD ["cat", "/log"]构成 linux/arm, linux/arm64, linux/amd64 镜像
1 | # 构建前需要配置好推送的镜像仓库,目前构建的镜像不会保存在本地。这里我使用 dockerhub 镜像仓库 |
- 查看 linux/arm, linux/arm64, linux/amd64 镜像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18$ docker buildx imagetools inspect yangpeng2468/test
Name: docker.io/yangpeng2468/test:latest
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
Digest: sha256:72d368f9a6696dc9551ec250d8a2e54bab85b8d0cb784e81cb4a7742090890a3
Manifests:
Name: docker.io/yangpeng2468/test:latest@sha256:9691c28fd9a98d735f05c913f61165f1367323eca6784a852d457fa1f74dab84
MediaType: application/vnd.docker.distribution.manifest.v2+json
Platform: linux/arm/v7
Name: docker.io/yangpeng2468/test:latest@sha256:59c54d4c1b1bee1bd2c23f38f9f2bffc292d0236a4032fba7e9be26fbe0d2802
MediaType: application/vnd.docker.distribution.manifest.v2+json
Platform: linux/arm64
Name: docker.io/yangpeng2468/test:latest@sha256:8f73236eead90974fa8ec0b15b5ae1b193786adbfc2d612bb1ab0c272957d3f8
MediaType: application/vnd.docker.distribution.manifest.v2+json
Platform: linux/amd64
测试多平台镜像
由于我的环境是 linux/amd64
,如果测试其它平台镜像,需要开启 binfmt_misc
功能
binfmt_misc
开启方法1
$ docker run --rm --privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d
查看
binfmt_misc
设置是否正确1
2
3
4
5
6
7
8$ ls -la /proc/sys/fs/binfmt_misc/
-rw-r--r-- 1 root root 0 11月 29 20:45 qemu-aarch64
-rw-r--r-- 1 root root 0 11月 29 20:45 qemu-arm
-rw-r--r-- 1 root root 0 11月 29 20:45 qemu-ppc64le
-rw-r--r-- 1 root root 0 11月 29 20:45 qemu-s390x
--w------- 1 root root 0 11月 29 20:29 register
-rw-r--r-- 1 root root 0 11月 29 20:29 status验证 linux/arm, linux/arm64, linux/amd64 镜像
1
2
3
4
5
6
7
8
9
10
11$ docker run -it --rm docker.io/yangpeng2468/test:latest@sha256:9691c28fd9a98d735f05c913f61165f1367323eca6784a852d457fa1f74dab84
I am running on linux/amd64, building for linux/arm/v7
$ docker run -it --rm docker.io/yangpeng2468/test:latest@sha256:59c54d4c1b1bee1bd2c23f38f9f2bffc292d0236a4032fba7e9be26fbe0d2802
I am running on linux/amd64, building for linux/arm64
$ docker run -it --rm docker.io/yangpeng2468/test:latest@sha256:8f73236eead90974fa8ec0b15b5ae1b193786adbfc2d612bb1ab0c272957d3f8
I am running on linux/amd64, building for linux/amd64
总结
未来,buildx
很有可能成为 docker build
命令一部分,大家一起期待吧!
参考链接
- https://docs.docker.com/buildx/working-with-buildx/
- https://www.infoq.cn/article/V9Qj0fJj6HsGYQ0LpHxg
---本文结束感谢您的阅读。微信扫描二维码,关注我的公众号---
本文作者:
Peng Yang
本文链接: https://www.yp14.cn/2019/11/29/一次构建多平台docker镜像/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
本文链接: https://www.yp14.cn/2019/11/29/一次构建多平台docker镜像/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!