Jib-Maven-плагин со скриптом Jenkins: как войти в личный реестр docker? - PullRequest
1 голос
/ 09 января 2020

Относительно этой проблемы , я обновил свое JHipster-приложение с помощью скриптового конвейера Jenkins и теперь в 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 -контейнер https://myregistry.mydomain.com (домен изменен по соображениям безопасности). Я могу успешно сделать $ docker login myregistry.mydomain.com (а также docker login https://myregistry.mydomain.com, а также docker login myregistry.mydomain.com:443) из локального bash с пользователем и паролем, хранящимся в 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?

1 Ответ

1 голос
/ 10 января 2020

Наконец-то у меня все получилось.

В 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 работает как docker -контейнер, опубликованный через nginx-proxy с letsencrypt-nginx-proxy-companion. В том же настраиваемом сетевом мосте мой собственный сервер jenkins запускается как другой docker -контейнер.

Некоторые тесты показали, что имя контейнера реестра docker нельзя назвать с помощью publi c DNS-имя реестра (например, myregistry.mydomain.com в качестве имени контейнера). Контейнер jenkins docker получает embedded docker dns server в resolv.conf, а docker разрешает имена контейнеров в той же сети во внутренние IP-адреса мостовой сети этих контейнеров (только в случае пользовательские сети docker).

Я полагаю, что jib должен подключиться через ssl к pu sh образу docker к контейнеру docker registry, а ssl должен быть обработан перед контейнером с nginx-proxy поэтому необходимо использовать внешний адрес домена docker registry.

Также необходимо настроить межсетевой экран docker hosts (в соответствии с этой ссылкой ), чтобы разрешить трафик c от docker контейнера jenkins до docker хоста. На хосте он снова возвращается к docker registry через nginx-proxy с ssl, верно? В моем случае это сводится к:

$ 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
...