Docker Buildx 无法从本地提取继承映像
Docker Buildx Cannot Pull From Local for Inherited Image
我的主机上有 2 个 Docker 文件 (Ubuntu 20.04)。我是 运行ning docker-ce 版本 Docker 版本 19.03.12,构建 48a66213fe,启用了实验功能。我能够使用“docker buildx”为 ARM 架构构建它们中的每一个,并在我的嵌入式 Linux ARM 板上成功地 运行 它们。
Docker文件 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
Docker文件 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
订阅者步骤相同。
由于图像基本相同,我想将发布者Docker文件更改为以下内容:
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 使用本地映像?谢谢。
有一些 different buildx drivers,它们各有优缺点。
首先是docker驱动程序。如果您不做任何更改,这就是默认构建器实例的驱动程序。它内置于 docker 引擎,应该对主机上的其他图像具有可见性。目标是类似于经典构建过程。
第二个是 docker-container,如果您使用 docker buildx create
创建新的构建器实例,则这是默认设置。这是特定功能所必需的,例如多平台图像和导出缓存。但由于它 运行 位于容器内,您不会在 docker 主机上看到其他图像。
尝试将 docker 主机用于多架构图像时的一个大问题是 docker 引擎本身不支持多架构图像。它只会从注册表中提取其中一种架构,因此您的映像将成为单一架构,可能无法在多架构构建中使用。
最简单的解决方法是为您的图像使用注册表。这支持您无法在 docker 主机上执行的多架构图像格式。当您 运行 在另一个节点上构建时,这是可移植的。
buildx documentation 中还有其他选项可以缓存 from/to 其他位置。但是在处理多架构基础镜像时,您会发现外部注册中心要容易得多,而且很可能是真正有效的。请记住,这不一定是 Docker 集线器,您可以 运行 在您 运行 构建的同一主机上拥有注册服务器。
旁注:如果您碰巧 运行 临时构建器(例如,在 CI 服务器上使用某种 DinD),buildx/buildkit 也可以从持久卷中获益。可以将 Buildkit 配置为自动对缓存进行垃圾回收,以避免过去的存储问题。使用该缓存,您无需在每次构建时从外部注册表下载图像层。
使用docker登录命令,然后在登录成功后提供用户登录帐户详细信息,然后重试docker构建命令
它会起作用。
我的主机上有 2 个 Docker 文件 (Ubuntu 20.04)。我是 运行ning docker-ce 版本 Docker 版本 19.03.12,构建 48a66213fe,启用了实验功能。我能够使用“docker buildx”为 ARM 架构构建它们中的每一个,并在我的嵌入式 Linux ARM 板上成功地 运行 它们。
Docker文件 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
Docker文件 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
订阅者步骤相同。
由于图像基本相同,我想将发布者Docker文件更改为以下内容:
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 使用本地映像?谢谢。
有一些 different buildx drivers,它们各有优缺点。
首先是docker驱动程序。如果您不做任何更改,这就是默认构建器实例的驱动程序。它内置于 docker 引擎,应该对主机上的其他图像具有可见性。目标是类似于经典构建过程。
第二个是 docker-container,如果您使用 docker buildx create
创建新的构建器实例,则这是默认设置。这是特定功能所必需的,例如多平台图像和导出缓存。但由于它 运行 位于容器内,您不会在 docker 主机上看到其他图像。
尝试将 docker 主机用于多架构图像时的一个大问题是 docker 引擎本身不支持多架构图像。它只会从注册表中提取其中一种架构,因此您的映像将成为单一架构,可能无法在多架构构建中使用。
最简单的解决方法是为您的图像使用注册表。这支持您无法在 docker 主机上执行的多架构图像格式。当您 运行 在另一个节点上构建时,这是可移植的。
buildx documentation 中还有其他选项可以缓存 from/to 其他位置。但是在处理多架构基础镜像时,您会发现外部注册中心要容易得多,而且很可能是真正有效的。请记住,这不一定是 Docker 集线器,您可以 运行 在您 运行 构建的同一主机上拥有注册服务器。
旁注:如果您碰巧 运行 临时构建器(例如,在 CI 服务器上使用某种 DinD),buildx/buildkit 也可以从持久卷中获益。可以将 Buildkit 配置为自动对缓存进行垃圾回收,以避免过去的存储问题。使用该缓存,您无需在每次构建时从外部注册表下载图像层。
使用docker登录命令,然后在登录成功后提供用户登录帐户详细信息,然后重试docker构建命令 它会起作用。