簡體   English   中英

Docker Buildx 無法從本地提取繼承圖像

[英]Docker Buildx Cannot Pull From Local for Inherited Image

我的主機上有 2 個 Dockerfile( Ubuntu 20.04 )。 我正在運行 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 使用本地映像? 謝謝。

有幾個不同的 buildx 驅動程序,它們都有權衡。

首先是docker驅動程序。 如果您不進行任何更改,這是默認構建器實例的驅動程序。 它內置在 docker 引擎中,應該可以看到主機上的其他圖像。 目標是類似於經典的構建過程。

第二個是docker-container如果您使用docker buildx create創建一個新的構建器實例,則它是默認值。 這是多平台圖像和導出緩存等特定功能所必需的。 但由於它在容器內運行,您不會在 docker 主機上看到其他圖像。


嘗試將 docker 主機用於多架構映像時,一個大問題是 docker 引擎本身不支持多架構映像。 它只會從注冊表中提取其中一個架構,因此您的映像變成了一個可能無法在多架構構建中使用的單一架構。

最簡單的解決方法是為您的圖像使用注冊表。 這支持在 docker 主機上無法實現的多架構圖像格式。 當您在另一個節點上運行構建時,這是可移植的。

buildx 文檔中還有其他選項可以從/到其他位置進行緩存。 但是在處理多架構基礎映像時,您會發現外部注冊表要容易得多,而且很可能是實際工作的那個。 請記住,這不一定是 Docker 集線器,您可以在運行構建的同一主機上運行自己的注冊表服務器。


旁注:如果您碰巧運行臨時構建器(例如在 CI 服務器上使用某種 DinD),buildx/buildkit 也受益於持久卷。 Buildkit 可以配置為自動垃圾收集這個緩存,以避免過去的存儲問題。 使用該緩存,您無需在每次構建時從外部注冊表下載圖像層。

使用 docker 登錄命令,然后在登錄成功后提供用戶登錄帳戶詳細信息,然后重試 docker 構建命令它將起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM