将映像推送到适用于多种架构(例如amd64,arm64)的Docker Hub,并自动提取正确的映像

我正在尝试为不同的架构(即amd64和arm64)创建一个映像。

我创建的Dockerfile的内容相同。

当我在amd64上的主机上从此Dockerfile构建时,生成的映像将在所有其他amd64机器上运行。但是,当我尝试在arm64上运行此映像时,会看到exec错误。

罪魁祸首似乎源于我使用Ubuntu作为基础映像(FROM: ubuntu:latest),它以某种方式“知道”我要构建的体系结构。结果,根据构建的架构,我最终得到了不同的图像。

这本身不是问题。毕竟,我可以在amd64上构建一次,然后在arm64上构建一次。

我想做的是能够为每种体系结构推送一个映像并将它们自动拉入其他计算机,而无需配置两组Dockerfile。换句话说,我真的很想知道Ubuntu团队如何配置映像,以便:latest提取最新版本正确的体系结构。

任何建议将不胜感激!

编辑:作为参考,我正在使用Docker 19.03.5。 Dockerfile看起来像这样:

FROM ubuntu:latest

COPY /requirements.txt /tmp/

RUN apt-get update && \
    apt-get install -y python3-pip python3-dev build-essential libssl-dev libffi-dev libxml2-dev libxslt1-dev && \
    apt-get install -y libtiff5-dev libjpeg8-dev zlib1g-dev
RUN cd /usr/local/bin && \
    ln -s /usr/bin/python3 python && \
    pip3 install --upgrade pip
RUN pip install lxml && \
    pip install -r /tmp/requirements.txt && \
    pip install gunicorn
tianlingling_2008 回答:将映像推送到适用于多种架构(例如amd64,arm64)的Docker Hub,并自动提取正确的映像

我建议将BuildKit与buildx一起使用,该版本在19.03中可用。首先,您可能需要在Linux主机上使用qemu和binfmt_misc进行交叉编译的设置。没有它,您将需要为每个要构建的平台建立一个构建节点。使用binfmt_misc,您需要两个重要的细节才能在容器内部工作,首先是需要静态用户二进制文件,其次是将它们注入内核时需要使用--fix-binary标志。首先,这取决于您安装的软件包名称,例如在Debian上,软件包名称是qemu-user-static。第二,这可能需要来自不稳定发行版的软件包版本。例如。以下是一些包含更改的错误报告:

完成此操作后,可以通过在--fix-binary中查找F标志来验证/proc/sys/fs/binfmt_misc/*的结果。

接下来,您需要设置一个buildx worker。可以通过以下方式完成:

docker buildx create --driver docker-container --name local --use \
  unix:///var/run/docker.sock
docker buildx inspect --bootstrap local

您应该从检查中看到以下内容,请注意多个平台:

$ docker buildx inspect --bootstrap local
[+] Building 54.1s (1/1) FINISHED
 => [internal] booting buildkit                                                                                                  54.1s
 => => pulling image moby/buildkit:buildx-stable-1                                                                               45.4s
 => => creating container buildx_buildkit_local0                                                                                  8.7s
Name:   local
Driver: docker-container

Nodes:
Name:      local0
Endpoint:  unix:///var/run/docker.sock
Status:    running
Platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/arm/v7,linux/arm/v6

现在,您可以为多个架构执行构建。 $image_and_tag必须是buildx可以在其中推送映像的外部注册表。您不能在本地拥有多架构映像,因为本地的docker镜像必须是一个平台,但是像Docker Hub这样的注册表确实支持多架构清单:

docker buildx build --platform linux/amd64,linux/arm64 \
  --output type=registry -t $image_and_tag .

您甚至可以使用qemu跨平台支持来测试其他图像:

docker container run --platform linux/arm64 $image_and_tag

请注意,您可能需要在docker中启用实验性CLI选项,但我忘记了哪些功能尚未纳入GA。在~/.docker/config.json中,添加:

{
  "auths": {
    ...
  },"experimental": "enabled"
}

注意:Docker桌面在一段时间内包含了qemu / binfmt_misc的设置,因此您可以直接跳至该环境中的buildx步骤。 Buildx也可以作为独立工具运行。有关更多详细信息,请参见回购:https://github.com/docker/buildx

本文链接:https://www.f2er.com/2910062.html

大家都在问