docekr在 x86d的 环境下打包arm64架构的docker包
buildx简介
buildx 可用于在单个平台上实现跨 CPU 架构编译。
buildx 的实现依赖 QEMU (某开源模拟器),支持多种 CPU 架构,如 ARM、Power-PC 和 RISC-V。
需要注意:buildx推送镜像时,不会走主机的hosts文件,默认使用https协议
关于QEMU
QEMU 可以模拟一个完整的操作系统(开销较大)。QEMU还有一种用户态模式,基于 binfmt_misc 模拟目标硬件的用户空间,该模式可以创建轻量级的虚拟机(chroot 或者 容器),通过该方式提供多种平台的虚拟机,然后基于Dockerfile进行编译,平台不通,但Dockerfile是同一份。
系统限制
Linux 内核v4.8及更高
Docker v19.03及更高
打包命令
# 1. 创建并使用新的构建器(如果还没有创建)
docker buildx create --name mybuilder --use
# 2. 启动构建器
docker buildx inspect --bootstrap
# 3. 构建 ARM64 架构的镜像
docker buildx build \
--platform linux/arm64 \
--load \
-t your-image-name:1.0.0 .
但是老是会出现连接问题,没有办法拉取镜像,及时通过魔法下载到了本地但是 后来才了解到buildx每次构建的时候是内部去拉取镜像 还是不行一直出现以下问题:
[+] Building 31.7s (3/3) FINISHED docker-container:mybuilder3
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 3.01kB 0.0s
=> ERROR [internal] load metadata for docker.io/library/python:3.8.12 31.7s
=> [auth] library/python:pull token for registry-1.docker.io 0.0s
------
> [internal] load metadata for docker.io/library/python:3.8.12:
------
Dockerfile:2
--------------------
1 | # base image
2 | >>> FROM python:3.8.12
3 | LABEL org.opencontainers.image.source https://github.com/serengil/deepface
4 |
--------------------
ERROR: failed to solve: DeadlineExceeded: DeadlineExceeded: DeadlineExceeded: python:3.8.12: failed to resolve source metadata for docker.io/library/python:3.8.12: failed to authorize: DeadlineExceeded: failed to fetch oauth token: Post "https://auth.docker.io/token": dial tcp 185.45.7.189:443: i/o timeout
一直报错连不上https://auth.docker.io/token
在网上找了各自解决方式,试了换镜像源、配置DNS、切换代理等等方式都是不行,但是我用docker build就没问题,想着这两之间构建的环境是一样的吗?问了下chatgpt给出的答案也很模糊,但是明确问题应该就是docker buildx 和docker build环境是不一样的,所以使用的docker login应该也不一样,
在使用 docker buildx之前我们都需要
docker buildx create --name mybuilder
docker buildx use mybuilder
这里使用了mybuilder环境,构建了新的 Buildx builder 实例后好像和默认的就不一致了,所以我切换到默认的环境
--看下有哪些
docker buildx ls
--切换到默认
docker context use default
docker buildx use default
然后在执行docker buildx就可以访问到认证信息,开始构建了。
当然在构建的时候会出现许多版本问题 原因是我是在x86的环境下去打包适配arm64架构的镜像包 再打包配置dockerfile文件的时候要去官网查找一下适配的镜像版本,或者一些相关的依赖包是不是两者都通用