2

关于这个问题,我用脚本化的 Jenkins 管道更新了我的 JHipster-Application 并且现在有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-container https://myregistry.mydomain.com(出于安全原因更改了域)。我可以$ docker login myregistry.mydomain.com使用docker login https://myregistry.mydomain.com存储docker login myregistry.mydomain.com:443myregistry-login.

pom.xml(遵循这些提示以及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>

whereusername和是这里imagenamede.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,对吗?我还在做错什么?为什么会有 I/O 错误registry-1.docker.io

4

1 回答 1

3

最后我让它工作了。

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

一些测试表明,docker 注册表的容器名称不能用注册表的公共 DNS 名称命名(例如,“myregistry.mydomain.com”作为容器名称)。docker jenkins-container 获取embedded docker dns serverinto resolv.conf,并且 docker 会将同一网络中容器的容器名称解析为这些容器的内部桥接网络 IP(仅在自定义 docker 网络的情况下)。

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

此外,必须配置 docker 主机防火墙(根据此链接)以允许从 docker 容器jenkins到 docker 主机的流量。在主机上,它会再次使用 ssl回到docker registryvia ,对吗?nginx-proxy就我而言,这归结为:

$ 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
于 2020-01-10T20:05:36.607 回答