关于这个问题,我用脚本化的Jenkins管道更新了我的JHipster应用程序,现在已经Jenkinsfile
了(部分遵循这些提示(:
[...]
def dockerImage
withEnv(["DOCKER_CREDS=credentials('myregistry-login')"]) {
stage('publish docker') {
sh "./mvnw -X -ntp jib:build"
}
}
使用 Jenkins全局凭据myregistry-login
保存在我的 Jenkins-Server 中,保存到我自己的 docker 注册表 v2 docker-containerhttps://myregistry.mydomain.com
(出于安全原因,域已更改(。我可以成功地从本地bash进行$ docker login myregistry.mydomain.com
(以及docker login https://myregistry.mydomain.com
以及docker login myregistry.mydomain.com:443
(,用户名和密码存储在myregistry-login
中。
在pom.xml
(遵循这些提示以及这个,这个和这个(:
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<configuration>
<to>
<image>myregistry.mydomain.com:443/username/imagename</image>
<tags>
<tag>${maven.build.timestamp}</tag>
<tag>latest</tag>
</tags>
<auth>
<username>${env.DOCKER_CREDS_USR}</username>
<password>${env.DOCKER_CREDS_PSW}</password>
</auth>
</to>
<container>
<jvmFlags>
<jvmFlag>-Xms512m</jvmFlag>
<jvmFlag>-Xmx1G</jvmFlag>
<jvmFlag>-Xdebug</jvmFlag>
</jvmFlags>
<mainClass>de.myproject_name.MyApp</mainClass>
</container>
</configuration>
</plugin>
其中username
、imagename
和de.myproject_name.MyApp
是这里的占位符。
不幸的是,我得到了
[DEBUG] TIMING Retrieving registry credentials for myregistry.mydomain.com:443
[DEBUG] No credentials could be retrieved for registry myregistry.mydomain.com:443
[...]
[ERROR] I/O error for image [myregistry.mydomain.com:443/username/imagename]:
[ERROR] Connect to myregistry.mydomain.com:443 [myregistry.mydomain.com/xxx.xxx.xxx.xxx] failed: Connection refused (Connection refused)
[DEBUG] TIMED Authenticating push to myregistry.mydomain.com:443 : 460.0 ms
[DEBUG] TIMED Building and pushing image : 514.0 ms
[ERROR] I/O error for image [registry-1.docker.io/library/adoptopenjdk]:
[ERROR] Socket closed
所以withEnv
没有转发给 Maven 和/或 jib-maven-plugin 没有读取<auth>
-Tag,对吧?我还做错了什么? 为什么要registry-1.docker.io
I/O 错误?
终于我让它工作了。
在Jenkinsfile
中,我将JHipster生成的代码编辑为:
def dockerImage
stage('publish docker') {
withCredentials([usernamePassword(credentialsId: 'myregistry-login', passwordVariable: 'DOCKER_REGISTRY_PWD', usernameVariable: 'DOCKER_REGISTRY_USER')]) {
sh "./mvnw -ntp jib:build" }
}
pom.xml
,我放置了 jib-maven-plugin 配置:
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<configuration>
<from>
<image>adoptopenjdk:11-jre-hotspot</image>
</from>
<to>
<auth>
<username>${DOCKER_REGISTRY_USER}</username>
<password>${DOCKER_REGISTRY_PWD}</password>
</auth>
<image>myregistry.mydomain.com/myuser/my_image</image>
<tags>
<tag>${maven.build.timestamp}</tag>
<tag>latest</tag>
</tags>
</to>
<container>
<jvmFlags>
<jvmFlag>-Xms512m</jvmFlag>
<jvmFlag>-Xmx1G</jvmFlag>
<jvmFlag>-Xdebug</jvmFlag>
</jvmFlags>
<mainClass>com.mypackage.MyApp</mainClass>
<entrypoint>
<shell>bash</shell>
<option>-c</option>
<arg>chmod +x /entrypoint.sh && sync && /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>
</configuration>
</plugin>
在我的远程服务器设置中,我自己的docker registry v2
作为通过nginx-proxy
发布的 docker 容器运行,letsencrypt-nginx-proxy-companion
.在同一个自定义网桥上运行我自己的jenkins
服务器作为另一个 docker 容器。
一些测试告诉我,docker 注册表的容器名称不能用注册表的公共 DNS 名称命名(例如,"myregistry.mydomain.com"作为容器名称(。jenkins
docker-container将embedded docker dns server
resolv.conf
,docker会将同一网络中容器的容器名称解析为这些容器的内部桥接网络IP(仅在自定义docker网络的情况下(。
我想 jib 必须通过 ssl 连接才能将 docker 映像推送到docker registry
容器,并且必须在具有nginx-proxy
的容器之前处理 ssl ,因此必须使用docker registry
域的外部地址。
此外,还必须配置 docker 主机防火墙(根据此链接(,以允许从 docker 容器jenkins
到 docker 主机的流量。在主机上,它再次通过带有 sslnginx-proxy
docker registry
,对吧?就我而言,这归结为:
$ sudo firewall-cmd --info-zone=public
public (active)
target: default
icmp-block-inversion: no
interfaces: enp6s0
sources:
[...]
rich rules:
rule family="ipv4" source address="172.26.0.13/32" accept