Jib-Maven-plugin with Jenkins 脚本化管道:如何登录私有 docker 注册表?



关于这个问题,我用脚本化的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>

其中usernameimagenamede.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.ioI/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 &amp;&amp; sync &amp;&amp; /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"作为容器名称(。jenkinsdocker-container将embedded docker dns serverresolv.conf,docker会将同一网络中容器的容器名称解析为这些容器的内部桥接网络IP(仅在自定义docker网络的情况下(。

我想 jib 必须通过 ssl 连接才能将 docker 映像推送到docker registry容器,并且必须在具有nginx-proxy的容器之前处理 ssl ,因此必须使用docker registry域的外部地址。

此外,还必须配置 docker 主机防火墙(根据此链接(,以允许从 docker 容器jenkins到 docker 主机的流量。在主机上,它再次通过带有 sslnginx-proxydocker 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

最新更新