当前位置: 首页 > 知识库问答 >
问题:

JIB-Maven-plugin与Jenkins脚本管道:如何登录到私人docker注册表?

曹浩
2023-03-14

关于这个问题,我用脚本化的Jenkins管道更新了JHipster应用程序,现在在Jenkins文件中(部分遵循以下提示):

[...]

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

Jenkins全局凭据mystracy-login保存在我的Jenkins-Server到我自己的docker注册表v2 docker-容器https://myregistry.mydomain.com(出于安全原因更改了域)。我可以使用存储在mystracy-login中的用户和密码从本地bash成功执行$docker登录myregistry.mydomain.com(以及docker登录https://myregistry.mydomain.com以及docker登录myregistry.mydomain.com:443)。

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插件没有读取


共有1个答案

方飞白
2023-03-14

我终于让它工作了。

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>
  <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注册表v2作为docker容器运行,该容器通过nginx-agent发布,带有letscrypt-nginx-proxy-同伴。在同一个自定义网络桥上运行我自己的jenkins服务器作为另一个docker容器。

一些测试表明docker注册表的容器名称不能用注册表的公共DNS名称命名(例如,“myregistry.mydomain.com”作为容器名称)。jenkinsdocker容器将嵌入式docker dns服务器放入resolv。conf,docker将把同一网络中容器的容器名称解析为这些容器的内部网桥网络IP(仅在自定义docker网络的情况下)。

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

此外,还必须配置docker hosts防火墙(根据此链接),以允许从docker容器jenkins到docker主机的流量。在主机上,它通过带有ssl的nginx代理再次返回到docker注册表,对吗?就我而言,这可以归结为:

$ 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
 类似资料:
  • 问题:- 在我的Jenkins脚本管道部分中有以下代码。我已经在Manage Jenkins下添加了我的私人Docker注册表URL和凭据-- Jenkins表单错误- 代码:-

  • 我有一个小问题与我的docker注册表上openshift源安装。 我创建了一个docker注册表pod: 创建了一条路线: 创建了一个服务: Openshift的Master是在10.0.2.235上的,只有一个节点,现在我已经创建了一个spring boot应用程序,我使用maven插件docker来构建和推送映像。 当我在本地(主计算机上)运行maven push时,工作正常,但如果我在另一

  • 注册厂商账号 打开浏览器访问注册页面 填写正确的邮箱地址后,点击"获取验证码"按钮,系统将自动发送带有注册验证码的邮件.填写验证码和后续的必要信息后,点击注册按钮,完成注册流程. 登录账号 注册成功后,浏览器将自动跳转到登录页面 填写公司名\密码和验证后.登录

  • 问题内容: Nexus UI配置 我在Linux VM上运行Nexus Repository Manager OSS 3.0.1-01,在该VM上,我让nginx致力于将代理http请求保留为https。我的SSL密钥由受信任的CA签名,我创建了一个maven存储库,只要有客户端计算机发布,它就可以正常工作。 同样在此客户端计算机上,当我使用docker客户端并进行docker登录时。我收到各种错

  • 我是GitLab用户。我使用groff脚本制作一本900页的书。输出将存储在输出文件夹中。当作者进行一些更改并推送到GitLab时,Docker映像将生成这本书。 其想法是构建一个docker容器,并将该容器存储在GitLab注册表中。容器的构建工作正常,但我收到一条错误消息。 错误出现在运行脚本中。docker登录不正确。 这就是我的跑步脚本的想法。gitlab ci。yml。我收到以下错误消息

  • 我有一个Maven SpringBoot项目。我想把它推到云工厂。为此,我为Jenkins编写了一个groovy管道脚本。我要补充什么?在脚本和/或pom中。xml将其发布到Artifactory中,这样Jenkins将从Git中提取代码并将其发布到Artifactory。在另一个环境中,我将拉出artifactory版本化的JAR,并将其推送到Cloud Foundry。 假设我的项目的grou