我正在尝试使用Google JIBmaven插件构建我的docker映像并将其部署到私有注册表。但是,它失败,访问私有注册表时出现问题。
我已经在我的Windows 10机器上安装了Docker Desktop v19.03.1。接下来,我尝试使用Google JIB Maven插件来构建我的Spring Boot应用程序,然后推送在私有注册表上构建的映像。
我已将 CERT 添加到 Windows 受信任的 CERTS 的"example.registry.com"中。我能够使用 docker 命令登录到私有注册表来验证这一点,如下所示:-
码头工人登录 example.registry.com
此命令返回身份验证成功,这意味着我添加的 CERT 已被接受。
登录私有注册表后,我能够使用 docker 命令行拉取和推送映像以成功"example.registry.com"。
下面是我的POM.xml文件。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>1.5.1</version>
<configuration>
<to>
<image>example.registry.com/inventory-service-docker:1.0</image>
<auth>
<username>plaintextusernameforRegistry</username>
<password>plaintestpasswordforRegistry</password>
</auth>
</to>
<from>
<image>openjdk:8</image>
</from>
<container>
<ports>
<port>8089</port>
</ports>
</container>
<allowInsecureRegistries>true</allowInsecureRegistries> <!-- this is commented on the first run.-->
</configuration>
</plugin>
当我从控制台从带有pom.xml文件的目录运行"mvn compile jib:build"命令时,它确实开始处理,但是在稍后阶段失败并出现以下错误:-
[错误] 无法在项目清单服务docker上执行目标com.google.cloud.tools:jib-maven-plugin:1.5.1:build (default-cli(:构建映像失败,也许您应该使用支持 HTTPS 的注册表或设置配置参数"allowInsecureRegistries":无法在 https://example.registry.com/v2/inventory-service-docker/blobs/sha256:9cc2ad81d40d54dcae7fa5e8e17d9c34e8bba3b7c2cc7e26fb22734608bda32e 处验证服务器,因为只有安全允许连接。
当我按照上述错误的建议设置配置参数"allowInsecureRegistries"后运行相同的命令时,我得到一个不同的错误,如下所示:-
[错误] 无法在项目清单服务码头上执行目标 com.google.cloud.tools:jib-maven-plugin:1.5.1:build (default-cli(:生成映像失败:无法使用注册表 example.registry.com/inventory-service-docker 进行身份验证,因为:sun.security.validator.Validator异常:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilder异常:无法找到所请求目标的有效证书路径
看起来像我在使用 JIB 时缺少的一些配置,它不能安全地连接到"example.registry.com"。
(在我开始之前,请不要使用 Jib 1.5.x,因为这些版本存在网络性能问题。
JVM不使用Windows证书存储。这个文档说
JRE 的一个大问题是它完全忽略了 Windows 证书存储。它不使用 Windows 证书存储,而是使用自己的实现
我刚刚在另一个答案中找到的Windows的一个潜在选择是使用-Djavax.net.ssl.trustStoreType=WINDOWS-ROOT
启动Java。但我还没有验证自己这是否有效。
另一种方法是将证书添加到缺省 Java 证书存储(信任库(文件 (cacerts
(。它通常位于<JDK>/lib/sercurity/
或<JRE>/jre/lib/security/
下。
有多种方法可以添加证书(例如,使用各种 GUI 工具(。例如
- 在命令行上
keytool.exe -import -storepass "changeit" -keystore "C:Program Files (x86)Javajre1.8.0_144libsecuritycacerts" -alias certificate.cer -file "C:certificate.cer" -noprompt
- 使用名为密钥库资源管理器的 GUI 工具
最后,对于那些想要获得更多解决此类 Java 证书问题的想法的人,请查看此评论。