【问题标题】:Docker Buildx Cannot Pull From Local for Inherited ImageDocker Buildx 无法从本地提取继承的映像
【发布时间】:2020-10-16 22:52:08
【问题描述】:

我的主机 (Ubuntu 20.04) 上有 2 个 Dockerfile。我正在运行 docker-ce 版本 Docker 版本 19.03.12,构建 48a66213fe 并启用了实验功能。我能够为 ARM 架构使用“docker buildx”构建它们中的每一个,并在我的嵌入式 Linux ARM 板上成功运行它们。

Dockerfile 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

Dockerfile 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 使用本地映像?谢谢。

【问题讨论】:

    标签: docker dockerfile embedded-linux docker-registry docker-buildkit


    【解决方案1】:

    different buildx drivers 有几个,各有取舍。

    首先是 docker 驱动程序。如果您不进行任何更改,这是默认构建器实例的驱动程序。它内置在 docker 引擎中,并且应该对主机上的其他图像具有可见性。目标是类似于经典的构建过程。

    第二个是 docker-container,如果您使用 docker buildx create 创建一个新的构建器实例,它是默认设置。这是多平台图像和导出缓存等特定功能所必需的。但由于它是在容器内运行的,因此您不会在 docker 主机上看到其他图像。


    尝试将 docker 主机用于多架构映像时的一个大问题是 docker 引擎本身不支持多架构映像。它只会从注册表中提取其中一个架构,因此您的映像会变成一个可能无法用于多架构构建的单一架构。

    最简单的解决方法是为您的图像使用注册表。这支持您无法在 docker 主机上执行的多架构图像格式。当您在另一个节点上运行构建时,这是可移植的。

    buildx documentation 中还有其他选项可以从/到其他位置进行缓存。但是在处理多架构基础映像时,您会发现外部注册表要容易得多,而且很可能是实际工作的那个。请记住,这不一定是 Docker Hub,您可以在运行构建的同一主机上运行自己的注册表服务器。


    旁注:如果您碰巧运行临时构建器(例如,在 CI 服务器上使用某种 DinD),buildx/buildkit 也受益于持久卷。 Buildkit 可以配置为自动垃圾收集这个缓存,以避免过去的存储问题。使用该缓存,您无需在每次构建时从外部注册表下载图像层。

    【讨论】:

      【解决方案2】:

      使用 docker login 命令,然后在登录成功后提供用户登录帐户详细信息,然后重试 docker build 命令 它会起作用的。

      【讨论】:

      • 它没有帮助我
      猜你喜欢
      • 2019-06-02
      • 2021-10-30
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      相关资源
      最近更新 更多