带有Jenkins脚本化管道的Jib-Maven-plugin:如何登录到私有Docker Registry?

关于this problem,我使用脚本化的Jenkins管道更新了JHipster-Application,现在进入了Jenkinsfile(部分these hints之后):

[...]

 def dockerImage
    withEnv(["DOCKER_CREDS=credentials('myregistry-login')"]) {
        stage('publish docker') {
            sh "./mvnw -X -ntp jib:build"
        }
    }

使用Jenkins全局凭据myregistry-login保存在我的Jenkins服务器中到我自己的docker Registry v2 docker-container https://myregistry.mydomain.com(出于安全原因更改了域)。我可以使用存储在$ docker login myregistry.mydomain.com中的用户名和密码从本地bash成功完成docker login https://myregistry.mydomain.com(以及docker login myregistry.mydomain.com:443myregistry-login)。

pom.xml中(在these hints以及thisthisthis之后):

<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.io出现I / O错误?

red0123450 回答:带有Jenkins脚本化管道的Jib-Maven-plugin:如何登录到私有Docker Registry?

最后我已经开始工作了。

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-proxyletsencrypt-nginx-proxy-companion发布的docker-container运行。在同一自定义网桥上,与另一个docker-container一起运行我自己的jenkins服务器。

一些测试显示我无法使用注册表的公共DNS名称来命名docker注册表的容器名称(例如,将“ myregistry.mydomain.com”作为容器名称)。 jenkins docker-container将embedded docker dns server放入resolv.conf中,docker会将同一网络中的容器的容器名称解析为这些容器的内部网桥IP(仅在自定义docker网络的情况。

我想臂架必须通过ssl进行连接以将docker镜像推送到docker registry容器,并且ssl必须在带有nginx-proxy的容器之前进行处理,因此{{1} }域。

还必须配置docker host防火墙(根据this link),以允许从docker容器docker registry到docker host的流量。然后,在主机上,它使用ssl通过jenkins回到docker registry,对吗?就我而言,这归结为:

nginx-proxy
本文链接:https://www.f2er.com/2798565.html

大家都在问