Docker Buildx无法从本地提取继承的映像

wnrlj8wa  于 2022-12-03  发布在  Docker
关注(0)|答案(2)|浏览(309)

我的主机(Ubuntu 20.04)上有2个Dockerfiles。我运行的是docker-ce版本,Docker版本19.03.12,build 48 a66213 fe,启用了实验功能。我能够使用“docker buildx”为ARM架构构建每个文件,并在我的嵌入式Linux ARM板上成功运行它们。
停靠文件1:

FROM python:3.8-slim-buster

COPY git /home/git

WORKDIR /home

RUN apt-get update -y && apt-get --no-install-recommends install build-essential pkg-config libzmq5 -y && \
    cd git && python3 setup.py install && apt remove --purge build-essential pkg-config -y && \
    apt auto-remove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/*

ADD publisher.py /home/publisher.py

停靠文件2:

FROM python:3.8-slim-buster

COPY git /home/git

WORKDIR /home

RUN apt-get update -y && apt-get --no-install-recommends install build-essential pkg-config libzmq5 -y && \
    cd git && python3 setup.py install && apt remove --purge build-essential pkg-config -y && \
    apt auto-remove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/*

ADD subscriber.py /home/subscriber.py

在主机上创建ARM兼容映像的构建过程:

docker buildx create --name builder || true
docker buildx use builder
docker buildx build --platform linux/arm/v7 -t "company-publisher:v1.3" . --load
docker save company-publisher:v1.3 > company-publisher-v1.3.tar

在ARM上加载图像:

docker load < ./company-publisher-v1.3.tar

用户的步骤相同。
由于图像基本相同,我想将发布者Dockerfile更改为以下内容:

FROM company-subscriber:v1.3

ADD publisher.py /home/publisher.py

Docker图像显示它就在本地:

REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
company-subscriber          v1.3                d2002fa18a8d        9 hours ago         121MB

但我得到了如下所示的错误-它总是试图从docker.io(显然没有我试图继承的图像):

docker buildx build --platform linux/arm/v7 -t "company-publisher:v1.3" . --load
[+] Building 1.5s (5/6)                                                                                                                                                                                              
 => [internal] load .dockerignore                                                                                                                                                                               0.0s
 => => transferring context: 2B                                                                                                                                                                                 0.0s
 => [internal] load build definition from Dockerfile                                                                                                                                                            0.0s
 => => transferring dockerfile: 104B                                                                                                                                                                            0.0s
 => ERROR [internal] load metadata for docker.io/library/company-subscriber:v1.3                                                                                                                               0.8s
 => [internal] load build context                                                                                                                                                                               0.0s
 => => transferring context: 34B                                                                                                                                                                                0.0s
 => ERROR [1/2] FROM docker.io/library/company-subscriber:v1.3                                                                                                                                                 0.7s
 => => resolve docker.io/library/company-subscriber:v1.3                                                                                                                                                       0.7s
------
 > [internal] load metadata for docker.io/library/company-subscriber:v1.3:
------
------
 > [1/2] FROM docker.io/library/company-subscriber:v1.3:
------
failed to solve: rpc error: code = Unknown desc = failed to load cache key: pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed

如何让buildx使用本地映像?

oprakyz7

oprakyz71#

有几种不同的buildx驱动程序,它们都有各自的优缺点。
首先是docker驱动程序。如果你不做任何改变的话,这是默认构建器示例的驱动程序。它内置于docker引擎中,应该对主机上的其他映像可见。目标是类似于经典的构建过程。
第二个是docker-container,如果你用docker buildx create创建一个新的构建器示例,这是默认的。这是多平台映像和导出该高速缓存等特定功能所需要的。但是由于它是在容器中运行的,你不会在docker主机上看到其他映像。
当尝试将docker主机用于多架构映像时,一个大问题是docker引擎本身不支持多架构映像。它只会从注册表中提取一个架构,因此您的映像变成了一个单一的架构,可能无法用于多架构构建。
最简单的解决方法是为你的映像使用一个注册表。这支持多架构的映像格式,这是你在Docker主机上做不到的。当你在另一个节点上运行构建时,这是可移植的。
buildx documentation中还有其他选项可以缓存到其他位置。但是当处理一个多拱基础映像时,你会发现外部注册表要容易得多,而且很可能是实际工作的那个。记住,这不一定是Docker Hub,你可以在运行构建的同一主机上运行你自己的注册表服务器。
附带说明:buildx/buildkit还受益于拥有一个持久卷,如果您碰巧运行临时构建器(例如,在CI服务器上使用某种DinD)。可以将Buildkit配置为自动垃圾收集此缓存,以避免过去的存储问题。使用此缓存,您无需从外部注册表下载每个构建的图像层。

kqlmhetl

kqlmhetl2#

使用Docker登录命令,然后提供用户登录帐户详细信息,一旦登录成功,然后重试Docker构建命令,它将工作。

相关问题