问题描述
在尝试使用GitHub上的仓库通过Docker Hub进行两个平台(linux/arm64和linux/amd64)的自动构建。用户已经发现,他需要一个包含build
文件的hooks
目录,可以在其中覆盖默认的构建命令。他创建了以下内容:
#!/bin/bash
export DOCKER_CLI_EXPERIMENTAL=enabled
docker buildx create --use --driver docker-container
docker buildx build --platform linux/amd64,linux/arm64 -f $DOCKERFILE_PATH -t $IMAGE_NAME . --push
然而,这只生成了linux/amd64
的镜像。用户猜测在构建过程中可能出现了一些问题(构建状态显示为’success’):
#11 [linux/arm64 3/3] RUN echo "https://dl-cdn.alpinelinux.org/alpine/edge/t...
#11 0.424 fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/aarch64/APKINDEX.tar.gz
...
#11 6.210 Executing busybox-1.31.1-r19.trigger
#11 6.214 ERROR: busybox-1.31.1-r19.trigger: script exited with error 1 <=== 这里出现了错误
#11 6.224 OK: 10 MiB in 33 packages
用户在Windows 10上的个人电脑上执行相同的命令时没有错误。用户将build
文件更改为使用默认驱动程序(docker)并仅构建linux/arm64
:
#!/bin/bash
export DOCKER_CLI_EXPERIMENTAL=enabled
docker buildx create --use
docker buildx build --platform linux/arm64 -f $DOCKERFILE_PATH -t $IMAGE_NAME . --push
然而,用户遇到了相同的错误,构建被显示为“success”,新镜像被推送到Docker Hub(新的digest),但os/arch为… linux/amd64
,而不是linux/arm64
。为什么会这样?
用户的目标是通过Docker Hub的自动构建来构建linux/amd64
和linux/arm64
两个平台的镜像。
解决方案
请注意以下操作可能会受到版本差异影响,请在进行操作前做好备份。
用户遇到的问题可能涉及到不同平台的构建过程中的差异。要实现多平台构建并成功生成适用于linux/amd64
和linux/arm64
的镜像,可以尝试以下方法。
使用多平台构建支持
Docker Buildx 是一个工具,可用于执行多平台构建。你已经在你的脚本中使用了 Buildx 命令,但可能还需要配置一些其他设置来确保多平台构建正常运行。
以下是一种可能的方法来修改你的构建脚本以支持多平台构建:
#!/bin/bash
export DOCKER_CLI_EXPERIMENTAL=enabled
# 创建并切换到 Buildx 构建器
docker buildx create --use --name mybuilder
# 配置支持的平台
docker buildx inspect mybuilder --bootstrap
docker buildx build --platform linux/amd64,linux/arm64 -f $DOCKERFILE_PATH -t $IMAGE_NAME . --push
通过以上步骤,你在构建之前创建了一个名为 mybuilder
的 Buildx 构建器,并指定了支持的平台。然后,你执行构建命令以构建适用于 linux/amd64
和 linux/arm64
的镜像。
确保镜像的正确标签
在你的构建脚本中,确保你指定了正确的镜像标签(-t
选项),以确保构建的镜像正确推送到 Docker Hub。
构建日志和错误分析
如果在构建中仍然遇到问题,可以详细查看构建日志以及出现的错误。这将有助于更好地了解在构建过程中发生了什么。你可以逐一检查构建日志中的每个步骤,并查看是否有与平台有关的错误。
更新 Docker 版本
如果你的问题与特定版本的 Docker 有关,可以尝试升级或降级 Docker 的版本。不同版本的 Docker 可能会有不同的行为和问题。
总之,确保你的构建脚本中正确配置了 Buildx 构建器和支持的平台,并检查镜像标签以及构建日志,以便找出并解决问题。
请注意,Docker 平台的构建过程可能会受到不同因素的影响,因此需要一些试验和调整来确保多平台构建的成功。在尝试这些解决方案时,请务必做好备份以防万一。
用户评论:也许 这个答案 可能会对你有所帮助… 我已经将这些命令保存为别名… 有时候我的多平台构建会出问题,我认为这可能是因为我清理了我的镜像、容器和层缓存,或者可能是主机上某些与 Docker 相关的更新;这些命令总能帮我解决问题。