使用buildx在Docker中使用本地镜像

16

我正在为在不同架构上运行的Docker容器构建映像。由于我并不总是有网络连接,所以通常只有在有网络连接时才拉取映像,Docker会使用本地映像而不是拉取新的映像。然而,在使用buildx开始构建映像后,这种方法似乎不再起作用了。有没有办法告诉Docker仅使用本地映像呢?当我有网络连接时,Docker似乎会检查是否有新版本可用,但在没有网络连接的情况下,使用了本地(或缓存)映像,就像我预期的那样。

$ docker image ls
ros                     galactic          bac817d14f26   5 weeks ago    626MB
$ docker image inspect ros:galactic
...
"Architecture": "arm64",
 "Variant": "v8",
 "Os": "linux",
...

构建命令示例

$ docker buildx build . --platform linux/arm64
WARN[0000] No output specified for docker-container driver. Build result will only remain in the build cache. To push result image into registry use --push or to load image into docker use --load 
[+] Building 0.3s (3/3) FINISHED                                                                                                  
 => [internal] load build definition from Dockerfile                                                                         0.0s
 => => transferring dockerfile: 72B                                                                                          0.0s
 => [internal] load .dockerignore                                                                                            0.0s
 => => transferring context: 2B                                                                                              0.0s
 => ERROR [internal] load metadata for docker.io/library/ros:galactic                                                        0.0s
------
 > [internal] load metadata for docker.io/library/ros:galactic:
------
Dockerfile:1
--------------------
   1 | >>> FROM ros:galactic
   2 |     RUN "echo hello"
   3 |     
--------------------
error: failed to solve: failed to fetch anonymous token: Get "https://auth.docker.io/token?scope=repository%3Alibrary%2Fros%3Apull&service=registry.docker.io": proxyconnect tcp: dial tcp 127.0.0.1:3333: connect: connection refused

6
你找到解决方法了吗?我也遇到了这个问题,buildx build 始终尝试从仓库中拉取,但我想让它使用我本地构建的 FROM 镜像(使用 buildx build --load 命令构建)。 - Nicolas
1
https://github.com/docker/buildx/issues/847 - zigarn
1个回答

1
我的解决方法是在Dockerfile的FROM部分明确指定注册表,可以是你自己的私有注册表或dockerhub。
例如,要使用dockerhub上的ubuntu:latest镜像,而不仅仅是执行FROM ubuntu:latest,我会在Dockerfile中写入: FROM docker.io/library/ubuntu:latest 要使用myprivateregistry:5000,我会使用: FROM myprivateregistry:5000/ubuntu:latest 并且您必须为docker buildx buildDOCKER_BUILDKIT=1 docker build命令设置--pull=false标志。当您再次拥有互联网时,可以再次使用--pull=true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接