首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker Buildx无法从本地获取继承的映像

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

Stack Overflow用户
提问于 2020-06-26 18:40:06
回答 2查看 18.6K关注 0票数 8

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

Dockerfile 1:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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兼容映像的构建过程:

代码语言:javascript
复制
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

在手臂上加载图像:

代码语言:javascript
复制
docker load < ./company-publisher-v1.3.tar

subsriber的步骤是相同的。

由于图像基本相同,我想将publisher Dockerfile更改为:

代码语言:javascript
复制
FROM company-subscriber:v1.3

ADD publisher.py /home/publisher.py

Docker镜像显示它在本地:

代码语言:javascript
复制
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
company-subscriber          v1.3                d2002fa18a8d        9 hours ago         121MB

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

代码语言:javascript
复制
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与本地镜像一起工作?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-26 19:44:57

有几个different buildx drivers,它们每个都有权衡。

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

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

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

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

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

附注:如果您碰巧运行临时构建器(例如,在CI服务器上使用某种DinD ),则buildx/buildkit还可以从持久卷中获益。Buildkit可以配置为自动对此缓存进行垃圾收集,以避免过去的存储问题。有了这个缓存,您就不必在每次构建时都从外部注册表下载映像层。

票数 6
EN

Stack Overflow用户

发布于 2020-12-28 03:37:02

使用docker login命令,然后提供用户登录帐户的详细信息,一旦登录成功,然后再次尝试docker build命令,它将工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62593004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档