Bootstrap

x509: certificate signed by unknown authority

从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 客户端的信任列表中。

  1. 获取证书

    • core.harbor1.domain 获取其 SSL 证书(通常是 .crt 文件)。
    • 如果你有权限访问服务器,可以使用以下命令导出证书:
      openssl s_client -connect core.harbor1.domain:443 -showcerts </dev/null 2>/dev/null | openssl x509 -outform PEM > core.harbor1.domain.crt
      
  2. 将证书添加到 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/
    • 将证书文件重命名为 ca.crt
  3. 重启 Docker 服务

    • 重启 Docker 以使更改生效:
      sudo systemctl restart docker
      
  4. 重新运行命令

    • 再次尝试运行 docker run 命令。

方法 2:禁用 SSL 验证(不推荐)

如果无法获取证书或无法修改 Docker 配置,可以临时禁用 SSL 验证。注意:这种方法不安全,仅适用于测试环境。

  1. 修改 Docker 配置

    • 编辑 Docker 的配置文件(通常是 /etc/docker/daemon.json),添加以下内容:
      {
        "insecure-registries": ["core.harbor1.domain"]
      }
      
  2. 重启 Docker 服务

    • 重启 Docker 以使更改生效:
      sudo systemctl restart docker
      
  3. 重新运行命令

    • 再次尝试运行 docker run 命令。

方法 3:手动拉取镜像

如果 Docker 仍然无法拉取镜像,可以尝试手动拉取镜像并重新打标签。

  1. 手动拉取镜像

    • 使用 docker pull 命令手动拉取镜像:
      docker pull core.harbor1.domain/flink/soc-saas-flink:demon-latest
      
  2. 重新打标签

    • 如果拉取成功,可以重新打标签以避免 SSL 问题:
      docker tag core.harbor1.domain/flink/soc-saas-flink:demon-latest flink-soc-saas-flink:demon-latest
      
  3. 运行容器

    • 使用新的标签运行容器:
      docker 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 验证。

  1. 编辑 Docker 服务文件

    • 编辑 Docker 的服务文件(通常是 /lib/systemd/system/docker.service),在 ExecStart 行中添加 --insecure-registry 参数:
      ExecStart=/usr/bin/dockerd --insecure-registry core.harbor1.domain
      
  2. 重启 Docker 服务

    • 重启 Docker 以使更改生效:
      sudo systemctl daemon-reload
      sudo systemctl restart docker
      
  3. 重新运行命令

    • 再次尝试运行 docker run 命令。

总结

  • 如果可能,优先使用 方法 1(信任自签名证书),这是最安全和推荐的方式。
  • 如果无法获取证书,可以尝试 方法 2(禁用 SSL 验证),但请注意安全风险。
  • 如果问题仍然存在,可以尝试 方法 3(手动拉取镜像)或 方法 4(旧版 Docker 的解决方案)。
;