我见过很多类似的问题,但似乎没有一个解决方案适合我的情况。 我正在使用在 Windows 上通过 WSL2 模拟的 Ubuntu,并且尝试从 dockerfile 构建 docker 映像,但出现以下错误:
docker build --tag build_machine .
[+] Building 0.3s (3/3) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 4.77kB 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> ERROR [internal] load metadata for <some_url>/centos:7 0.2s
------
> [internal] load metadata for <some_url>/centos:7:
------
Dockerfile:2
--------------------
1 | # Set parent
2 | >>> FROM <some_url>/centos:7
3 |
4 | # Set working directory
--------------------
ERROR: failed to solve: <some_url>/centos:7: failed to do request: Head "https://<some_url>/v2/centos/manifests/7": tls: failed to verify certificate: x509: certificate signed by unknown authority
其中
我尝试编辑
/etc/docker/daemon.json
配置文件以禁用 tls 验证,但是当我尝试重新启动 docker 守护程序时,我收到一条错误消息,指出配置无效。
我怀疑这是因为我真的不知道我应该提供哪个证书。
事实上,我还尝试了以下方法(使用 --tls 选项):
docker --tls build --tag build_machine .
ERROR: open /home/msalis/.docker/ca.pem: no such file or directory
起初,这看起来像是一个进步,但是,当我尝试提供应有的证书时,我得到了以下信息:
docker --tls build --tag build_machine .
ERROR: Cannot connect to the Docker daemon at tcp://localhost:2376. Is the docker daemon running?
主要是欺骗“docker pull”证书由未知机构签名,它指向https://docs.docker.com/registry/insecure/
我也尝试过[CLI 上的
选项] 起初,它看起来像是一个进步....--tls
不,这不是进步,这是倒退。当它甚至无法 try 连接到守护进程时,早在守护进程执行构建文件中的 FROM 之前就会出现错误。
CLI中的--tls
适用于CLI和守护进程之间的连接;它与守护进程为获取图像而与注册表建立的连接完全无关,如 FROM
或 pull
。除非您想要(或需要)从守护程序远程运行 CLI,否则使用默认的 Unix 套接字或 Windows 命名管道比管理 TLS 或 SSH 连接更容易。
您需要为daemon提供“CA”证书(我不确定它是否需要专门的根证书或只是一个锚点;SSL/TLS 堆栈在这方面有所不同,而且我没有自己的注册表测试)或使 CA 在您的(实际上是守护进程的)底层系统上受信任(对于 Ubuntu,请参阅
man update-ca-certificates
)(并根据上面的链接反弹守护进程)或配置 daemon 以接受不安全的注册表;请参阅https://docs.docker.com/engine/reference/commandline/dockerd/#insecure-registries,特别是https://docs.docker.com/registry/insecure/#use-self-signed-certificates .
非常感谢! 以下是我如何解决问题的完整摘要: 我已经尝试了https://docs.docker.com/registry/insecure/中解释的解决方案,但不知何故我无法正确设置
"insecure-registries"
。
然后,我尝试下载证书(在我的情况下,需要两个,而不是一个),但是,我没有将它们复制到/home/msalis/.docker/
(正如我看到误导性跟踪时所想的那样:“错误:打开/home/msalis/. docker/ca.pem:没有这样的文件或目录”),我已将它们复制到/usr/local/share/ca-certificates/
中。
然后我按照建议调用了 update-ca-certificates
并重新启动了 docker。
这一切似乎都有效,除了这次我得到了以下结果:
docker build --tag build_machine .
[+] Building 0.4s (3/3) FINISHED docker:default
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 4.77kB 0.0s
=> ERROR [internal] load metadata for <some_url>/centos:7 0.3s
------
> [internal] load metadata for <some_url>/centos:7:
------
Dockerfile:2
--------------------
1 | # Set parent
2 | >>> FROM <some_url>/centos:7
3 |
4 | # Set working directory
--------------------
ERROR: failed to solve: <some_url>/centos:7: failed to authorize: failed to fetch anonymous token: unexpected status from GET request to https://<some_other_url>: 401 Unauthorized
此时,我被告知我根本无法访问公司注册表,因此我切换到标准注册表(即将
FROM <some_url>/centos:7
更改为简单的 FROM centos:7
),但至少我设法通过VPN(这确实是我最初的问题)。
再次非常感谢您,我对这个证书的东西很陌生,只需要一些指导。