从harbor拉去镜像报错
$ docker run --rm -it core.harbor1.domain/<image>:demon-latest bash
x509: certificate signed by unknown authority
从错误信息来看,Docker 在尝试从 core.harbor1.domain
拉取镜像时,遇到了 SSL 证书验证失败的问题。具体错误是:
x509: certificate signed by unknown authority
这意味着 Docker 无法验证 core.harbor1.domain
的 SSL 证书,可能是因为该证书是自签名的,或者 Docker 客户端不信任该证书的颁发机构。
解决方法
以下是几种常见的解决方法:
方法 1:信任自签名证书
如果 core.harbor1.domain
使用的是自签名证书,可以将该证书添加到 Docker 客户端的信任列表中。
-
获取证书:
-
从
core.harbor1.domain
获取其 SSL 证书(通常是.crt
文件)。 -
如果你有权限访问服务器,可以使用以下命令导出证书:
bashopenssl s_client -connect core.harbor1.domain:443 -showcerts </dev/null 2>/dev/null | openssl x509 -outform PEM > core.harbor1.domain.crt
-
-
将证书添加到 Docker 的信任列表:
- 将证书文件复制到 Docker 的证书目录中。具体路径取决于操作系统:
- Linux :
/etc/docker/certs.d/core.harbor1.domain/
- Windows :
C:\ProgramData\docker\certs.d\core.harbor1.domain\
- macOS :
~/.docker/certs.d/core.harbor1.domain/
- Linux :
- 将证书文件重命名为
ca.crt
。
- 将证书文件复制到 Docker 的证书目录中。具体路径取决于操作系统:
-
重启 Docker 服务:
-
重启 Docker 以使更改生效:
bashsudo systemctl restart docker
-
-
重新运行命令:
- 再次尝试运行
docker run
命令。
- 再次尝试运行
方法 2:禁用 SSL 验证(不推荐)
如果无法获取证书或无法修改 Docker 配置,可以临时禁用 SSL 验证。注意:这种方法不安全,仅适用于测试环境。
-
修改 Docker 配置:
-
编辑 Docker 的配置文件(通常是
/etc/docker/daemon.json
),添加以下内容:json{ "insecure-registries": ["core.harbor1.domain"] }
-
-
重启 Docker 服务:
-
重启 Docker 以使更改生效:
bashsudo systemctl restart docker
-
-
重新运行命令:
- 再次尝试运行
docker run
命令。
- 再次尝试运行
方法 3:手动拉取镜像
如果 Docker 仍然无法拉取镜像,可以尝试手动拉取镜像并重新打标签。
-
手动拉取镜像:
-
使用
docker pull
命令手动拉取镜像:bashdocker pull core.harbor1.domain/flink/soc-saas-flink:demon-latest
-
-
重新打标签:
-
如果拉取成功,可以重新打标签以避免 SSL 问题:
bashdocker tag core.harbor1.domain/flink/soc-saas-flink:demon-latest flink-soc-saas-flink:demon-latest
-
-
运行容器:
-
使用新的标签运行容器:
bashdocker run --rm -it flink-soc-saas-flink:demon-latest bin/sql-client.sh -Drest.address=10.50.108.7 -Drest.port=40403 -Dpipeline.operator-chaining.enabled=false -Dexecution.runtime-mode=batch
-
方法 4:使用 --insecure-registry
参数(旧版 Docker)
如果你使用的是旧版 Docker(1.13 或更早版本),可以通过启动 Docker 时添加 --insecure-registry
参数来禁用 SSL 验证。
-
编辑 Docker 服务文件:
-
编辑 Docker 的服务文件(通常是
/lib/systemd/system/docker.service
),在ExecStart
行中添加--insecure-registry
参数:iniExecStart=/usr/bin/dockerd --insecure-registry core.harbor1.domain
-
-
重启 Docker 服务:
-
重启 Docker 以使更改生效:
bashsudo systemctl daemon-reload sudo systemctl restart docker
-
-
重新运行命令:
- 再次尝试运行
docker run
命令。
- 再次尝试运行
总结
- 如果可能,优先使用 方法 1(信任自签名证书),这是最安全和推荐的方式。
- 如果无法获取证书,可以尝试 方法 2(禁用 SSL 验证),但请注意安全风险。
- 如果问题仍然存在,可以尝试 方法 3 (手动拉取镜像)或 方法 4(旧版 Docker 的解决方案)。