使用buildx在x86机器上面编译arm64架构的Docker镜像

使用,buildx,x86,机器,上面,编译,arm64,架构,docker,镜像 · 浏览次数 : 292

小编点评

**多架构编译安装docker下载docker下载buildx安装架构支持docker run --privileged --rm tonistiigi/binfmt --install all** **信息:** * 使用 Docker Buildx 创建多架构的容器。 * 构建基于arm64、amd64和arm64v2平台的 Docker Images。 * 使用 `docker run` 命令启动容器时指定平台。 **步骤:** 1. 创建一个名为 `mybuilder` 的 Docker Buildx build。 2. 使用 `--use` 选项指定多架构构建。 3. 使用 `--name` 选项指定容器名称为 `mybuilder`。 4. 使用 `--bootstrapNodes` 选项指定 Bootstrap节点的 IP 地址和端口。 5. 使用 `--buildx build` 指令构建 Docker Images。 6. 使用 `docker run` 命令启动容器。 **构建 Docker Images 的详细信息:** * `FROM docker.io/adoptopenjdk/openjdk8WORKDIR /app`:从 Docker Hub上的 OpenJDK WORKDIR镜像构建基础镜像。 * `COPY /app /app /appENTRYPOINT [\"java\",\"-Djava.security.egd=file:/dev/./urandom\",\"-Dloader.path=./server/runtime/3rd,./server/runtime/libs\",\"-Dparallel.startup=true\",\"-Dserver.runtime.path.name=server\",\"-XX:+UseContainerSupport\",\"-XX:MaxRAMPercentage=75.0\",\"-XX:InitialRAMPercentage=75.0\",\"-XX:MinRAMPercentage=75.0\",\"-XX:-DisableExplicitGC\",\"-XX:+PrintGC\",\"-XX:+PrintGCDateStamps\",\"-XX:+PrintGCDetails\",\"-XX:+PrintGCTimeStamps\",\"-Xloggc:/app/dump/gclog\",\"-XX:+HeapDumpOnOutOfMemoryError\",\"-XX:HeapDumpPath=/app/dump\",\"-jar\",\"./server/runtime/caf-bootstrap.jar\",\"--spring.config.location=./server/runtime/\"]`:构建容器时运行 Java镜像的构建步骤。 **其他提示:** * 使用 `docker buildx build -t zhaobsh:arm64 --platform=linux/arm64 -o type=docker .` 命令构建针对arm64平台的 Docker Images。 * 使用 `docker buildx build -t zhaobsh:amd64 --platform=linux/amd64 -o type=docker .` 命令构建针对amd64平台的 Docker Images。 * 使用 `docker buildx build -t harbor.xxxx.com/library/zhaobsh --platform=linux/arm,linux/arm64,linux/amd64 . --push#` 命令构建针对arm、arm64和amd64平台的 Docker Images并将其推送到 Harbor。

正文

buildx 多架构编译


安装docker

下载docker
下载buildx
安装架构支持
docker run --privileged --rm tonistiigi/binfmt --install all

创建一个自己的空间
buildx create --use --name mybuilder

检查支持的架构
buildx inspect mybuilder --bootstrap

Nodes:
Name:      mybuilder0
Endpoint:  unix:///var/run/docker.sock
Status:    running
Buildkit:  v0.11.6
Platforms: linux/arm64, linux/amd64, linux/amd64/v2, linux/riscv64, linux/ppc64le, linux/s390x, linux/mips64le, linux/mips64

打包镜像

dockerfile 的信息为:
# 注意from 好像不能写带架构的. 会根据platform自动进行下载. 比较简单. 


FROM docker.io/adoptopenjdk/openjdk8
WORKDIR /app
COPY /app /app
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dloader.path=./server/runtime/3rd,./server/runtime/libs","-Dparallel.startup=true","-Dserver.runtime.path.name=server","-XX:+UseContainerSupport","-XX:MaxRAMPercentage=75.0","-XX:InitialRAMPercentage=75.0","-XX:MinRAMPercentage=75.0","-XX:-DisableExplicitGC","-XX:+PrintGC","-XX:+PrintGCDateStamps","-XX:+PrintGCDetails","-XX:+PrintGCTimeStamps","-Xloggc:/app/dump/gclog","-XX:+HeapDumpOnOutOfMemoryError","-XX:HeapDumpPath=/app/dump","-jar","./server/runtime/caf-bootstrap.jar","--spring.config.location=./server/runtime/"]


buildx build -t zhaobsh:arm64 --platform=linux/arm64 -o type=docker .
buildx build -t zhaobsh:amd64 --platform=linux/amd64 -o type=docker .

我在arm上面搭建的就不行没法运行amd64的

docker run -it zhaobsh:amd64
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
java: error while loading shared libraries: libpthread.so.0: ELF load command alignment not page-aligned

然后 arm64自己的进行验证



可以直接push操作

buildx build -t harbor.xxxx.com/library/zhaobsh  --platform=linux/arm,linux/arm64,linux/amd64 . --push

# 这个我还没测试

迁移测试

docker save zhaobsh:amd64 |gzip > zhaobsh_amd64.tgz 
然后在amd64的机器上面进行验证. 

也可以使用如下命令进行检查具体的架构信息: 

[root@auto02 docker]# docker inspect zhaobsh:amd64 |grep Architecture
        "Architecture": "amd64",
[root@auto02 docker]# docker inspect zhaobsh:arm64 |grep Architecture
        "Architecture": "arm64",
[root@auto02 docker]# 

与使用buildx在x86机器上面编译arm64架构的Docker镜像相似的内容: