构建Docker镜像失败,出现了“无法获取匿名令牌,TLS握手超时”的错误提示。

36

我在使用docker build -t image_name .创建Docker镜像时遇到了问题。当我执行它时,会出现错误:

 => [internal] load build definition from Dockerfile                                                               0.1s
 => => transferring dockerfile: 32B                                                                                0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => ERROR [internal] load metadata for docker.io/library/java:8                                                    0.2s
------
 > [internal] load metadata for docker.io/library/java:8:
------
failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to authorize: rpc error: code = Unknown desc = failed to fetch anonymous token: Get https://auth.docker.io/token?scope=repository%3Alibrary%2Fjava%3Apull&service=registry.docker.io: net/http: TLS handshake timeout

19
为了解决问题,我在进行docker build之前先对基础镜像进行了docker pull操作。 - SerG
这个问题还有意义吗?如果有的话,您使用的是哪个操作系统?您是如何安装Docker的?手动拉取镜像返回了什么? - Noam Yizraeli
@SerG - 谢谢! - dugas
在使用 Mercury(通过 Docker 提供 Jupyter 笔记本:https://github.com/mljar/mercury)时,使用 docker-compose build 时遇到了类似的错误。在我的情况下,解决方案是从笔记本中删除一个裸字符串多行注释。(预期的笔记本格式不允许在该位置使用字符串。)简而言之:这也可能是由于单个容器中的错误而不是主机 DNS 导致的。 - Sarah Messer
感谢@SerG,但愿我在两个小时之前就看到了你的评论,不知何故重新拉取图像让我得以构建... - Arnaud Bouchot
4个回答

21

在运行一个用于构建earthly/earthly的脚本时,我最近遇到了这个问题。

操作系统: Arch Linux 5.14.8-arch1-1

来自官方仓库的Docker: Docker版本20.10.8,构建3967b7d28e

解决方法(可能仅适用于Linux)

对我来说DNS配置不正确。由于某种原因,docker pull golang:1.16-alpine3.14在运行构建脚本时失败,但是单独运行却可以正常工作。来自r/docker上的这个答案帮了我。

将DNS域名服务器添加到我的/etc/resolv.conf文件中解决了这个问题:

cat /etc/resolv.conf
# Cloudflare
nameserver 1.1.1.1

其他尝试的解决方案

1. 禁用Buildkit

根据这个答案来自Docker build: failed to fetch oauth token for openjdk?, 这并没有解决问题,因为我认为该脚本需要buildkit:

export DOCKER_BUILDKIT=0
export COMPOSE_DOCKER_CLI_BUILD=0

2. 手动拉取镜像

3. 使用 Docker 进行身份验证

错误看起来像是在未经过 hub.docker.com 认证的情况下可能会发生的问题。使用 docker login --username <username> 登录后,我仍然收到了这些错误。


1
在我的机器上,我有一个 /etc/resolv.conf 但没有 /etc/resolve.conf,注意多了一个 e。不确定这个文件名是否因发行版而异。 - Patrik Iselind
1
@PatrikIselind 你是对的,我拼错了文件名。已编辑并修复,谢谢!https://man7.org/linux/man-pages/man5/resolv.conf.5.html - cam
1
手��拉取图像对我很有帮助。每次都在20秒时准确超时。 - Kundan
@tentative 你只在一个位置进行了编辑。 - MikeKulls
这对我解决了问题,但由于那个额外的“e”,我比需要的多花了几个小时。对我来说,这是一个问题,因为机器有两张网络卡。我尝试自己编辑您的帖子,但它显示“编辑队列已满”。编辑->哦,你修复了它。谢谢。 - MikeKulls
1
是的,我忘记登录了。谢谢你帮我省了几个小时 XD - Roman Khabibulin

4

如果您使用的是MacOS,请检查是否有任何拦截流量的系统扩展程序,例如防火墙、VPN客户端和安全工具。 在终端应用程序中运行systemextensionsctl list

1 extension(s)
--- com.apple.system_extension.network_extension
enabled active  teamID  bundleID (version)  name    [state]
*   *   78UFGP42EU  ch.tripmode.TripMode.FilterExtension (3.1.0/1304)   FilterExtension [activated enabled]

在我的情况下,应用程序 TripMode 是问题的原因。卸载该工具并重新启动系统可解决问题。

2
这是VPN的原因... - OctaviaLo

0
在我的情况下,这发生在Windows的Ubuntu WSL2上。这发生在运行以下命令时:
``` docker build -t cbusha-be:latest . ```
在意外情况下,已经运行过以下命令:
``` docker buildx build -t cbusha-be:latest . ```
一旦我切换回BuildX命令,它又正常工作了。

0
关于在resolv.conf中设置DNS的问题,我想补充一下,但是显然我声望不够高,无法发表评论。一些Linux应用程序直接读取resolv.conf文件,而不使用systemd-resolved(Arch默认使用)。你可以通过将/etc/resolv.conf替换为指向systemd-resolved DNS存根文件的链接来解决这个问题,具体操作如下: ln -rsf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf 这个问题在文档的DNS部分有详细介绍,你可以参考https://wiki.archlinux.org/title/Systemd-resolved

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