我开发了一个Dockerized Spring Boot应用程序,使用AdoptOpenJDK作为基本映像,使用jib-maven-plugin
。
我的插件配置是:
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>${jib-maven-plugin.version}</version>
<configuration>
<from>
<image>adoptopenjdk:11-jre-hotspot</image>
</from>
<to>
<image>public/my-app</image>
<tags>
<tag>latest</tag>
<tag>${project.version}</tag>
</tags>
</to>
<container>
<entrypoint>
<shell>bash</shell>
<option>-c</option>
<arg>/entrypoint.sh</arg>
</entrypoint>
<ports>
<port>8080</port>
</ports>
<environment>
<SPRING_OUTPUT_ANSI_ENABLED>ALWAYS</SPRING_OUTPUT_ANSI_ENABLED>
<JHIPSTER_SLEEP>0</JHIPSTER_SLEEP>
</environment>
<creationTime>USE_CURRENT_TIMESTAMP</creationTime>
</container>
<extraDirectories>
<paths>src/main/jib</paths>
<permissions>
<permission>
<file>/entrypoint.sh</file>
<mode>755</mode>
</permission>
</permissions>
</extraDirectories>
</configuration>
</plugin>
一切正常,并且应用程序在启动./mvnw package -Pprod -DskipTests jib:build -T16.0C
时正确构建。现在我正在集成我的应用程序在CI/CD詹金斯管道,我正在创建一个命令像第一个,但通过Auth数据使用变量:
./mvnw -ntp -T2.0C jib:build -Djib.from.auth.username=myUserName -Djib.from.auth.password=mygitlabtoken01 -Dimage=registry.gitlab.com/myapp -X
当我运行它时,我得到:
[INFO] Using credentials from Docker config (/Users/myUser/.docker/config.json) for registry.gitlab.com/neoris-emea-internal/ianthe/ianthe-app/ianthe
[DEBUG] attempting bearer auth for registry.gitlab.com/app...
[INFO] The base image requires auth. Trying again for adoptopenjdk:11-jre-hotspot...
[INFO] Using credentials from <from><auth> for adoptopenjdk:11-jre-hotspot
[DEBUG] Trying basic auth for adoptopenjdk:11-jre-hotspot...
[DEBUG] configured basic auth for registry-1.docker.io/library/adoptopenjdk
[DEBUG] TIMED Authenticating push to registry.gitlab.com : 1091.927 ms
[DEBUG] TIMED Building and pushing image : 1122.522 ms
[ERROR] I/O error for image [registry-1.docker.io/library/adoptopenjdk]:
[ERROR] javax.net.ssl.SSLHandshakeException
[ERROR] Remote host terminated the handshake
我什么都不懂:
- 如果我用
-Djib.from.auth.username=myUserName
指示了真实信息,为什么jib插件使用我的.docker/config.json
? - 为什么我得到
SSLHandshakeException
?虽然构建使用我的凭据,但这些是正确的。
如果你仔细查看日志消息,Jib确实使用了你通过from.auth.username|password
为adoptopenjdk
(托管在Docker Hub上)指定的凭据。
Using credentials from <from><auth> for adoptopenjdk:11-jre-hotspot
请注意,下面一行表示Docker配置用于registry.gitlab.com
(目标注册表)。
Using credentials from Docker config (/Users/myUser/.docker/config.json) for registry.gitlab.com/neoris-emea-internal/ianthe/ianthe-app/ianthe
关于SSLHandshakeException
,它与任何Docker凭据无关。错误来自更低的网络层(TLS协议),因此失败基本上与Jib或在Jenkins上的JVM中运行的任何应用程序无关。它基本上告诉您,JVM上的任何Java应用程序都无法与某些主机建立安全的TLS连接。TLS握手失败没有简单的答案或解决方案,所以如果可能的话,请从网络和TLS专家那里获得一些帮助。也可以看看其他类似的问题。