X86机器Docker编译arm镜像

1,879 阅读4分钟

了解docker打包过程

Dockerfile是在Docker引擎环境中运行的。Docker引擎是一个开源的容器化平台,可以在不同的操作系统上运行,例如Linux、macOS和Windows等。Docker引擎负责创建和管理容器,以及执行Dockerfile中的指令。
具体来说,在使用Docker构建镜像时,会使用Docker引擎来执行Dockerfile中的每个指令,并生成一个新的Docker镜像。Docker引擎会按照Dockerfile中的指令顺序逐条执行,创建临时的容器运行环境,并在构建过程中生成每个指令对应的镜像层。这些镜像层最后组合在一起,形成最终的Docker镜像。 需要注意的是,不同的操作系统上使用Docker时,Docker引擎本身可能有一些差异,例如在Linux上使用Docker时,可以直接在本机上运行Docker引擎;而在macOS和Windows上,可能需要通过Docker Desktop等工具来运行Docker引擎。但不论在哪种操作系统上使用Docker,Dockerfile都是在Docker引擎环境中运行的。

Docker引擎依赖于本机环境。具体来说,Docker引擎在操作系统上运行,并与操作系统的内核进行交互来管理容器。 在Linux上,Docker引擎使用操作系统的原生容器技术,如Linux容器(LXC)或systemd-nspawn。这样,Docker引擎能够直接利用Linux内核的命名空间、控制组(cgroups)和其他特性来实现容器的隔离和资源管理。 在macOS和Windows上,Docker引擎依赖于额外的中间层,通常是通过Docker Desktop等工具来提供的。这些工具在宿主操作系统上运行一个虚拟机,然后在虚拟机内部运行Docker引擎。这样,Docker引擎可以使用虚拟机提供的功能来创建和管理容器。 无论是在Linux、macOS还是Windows上运行Docker引擎,它都依赖于本机的操作系统和硬件资源。Docker创建的容器在物理资源上是与宿主机分离的,但它们共享宿主机的操作系统内核。因此,Docker引擎的性能和功能受限于宿主机的操作系统和硬件环境。

实现在不同CPU架构上打包Docker镜像的方法有以下几种:

  • 使用多阶段构建(Multi-stage Builds):Docker支持通过多阶段构建来在不同的CPU架构上构建镜像。你可以在Dockerfile中定义多个构建阶段,每个阶段使用不同的基础镜像和构建指令。然后,通过使用不同CPU架构的构建工具和指令来分别构建每个阶段的镜像。
  • 基于多平台镜像(Multi-platform Images):从Docker 18.09版本开始,Docker支持创建和使用多平台镜像。你可以创建一个镜像manifest列表文件,其中包含了不同CPU架构的镜像构建规则。然后,通过使用docker buildx工具来构建多平台镜像,该工具会根据manifest列表文件来选择正确的构建规则。
  • 使用基础镜像的不同版本或不同CPU架构的变体:有些镜像可能已经根据不同的CPU架构提供了不同版本或变体。你可以通过查找和选择相应的基础镜像来构建适用于特定CPU架构的Docker镜像。

无论采用哪种方法,你都需要根据不同的CPU架构来进行构建和测试,确保Docker镜像能够在目标CPU架构上正常运行。此外,你还需要注意CPU兼容性和依赖的问题,以确保镜像在不同的CPU架构上具有可移植性和兼容性。

x86机器打包arm

x86机器打包arm镜像,需要在机器上装qemu-user,利用qemu-user可以运行不同架构的用户态程序

sudo apt install qemu-user-static

获取不到qemu-user

我们打包是通过Jenkins,但是拿不到qemu-user,只能通过docker每次安装

docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

打包

x86机器: docker build -t 镜像包名 -o type=docker .

Mac机器: docker buildx build --platform linux/arm64 -t 镜像包名 -o type=docker .

苹果芯(M1/M2)打包在Linux(amd)上运行报错

standard_init_linux.go:228: exec user process caused: exec format error

打包加上--platform linux/amd64

docker build -t 1.117.192.82:8666/lottery/lottery:v1.0.1 . --platform linux/amd64