Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-65216

Daemonless Docker Build

    XMLWordPrintable

    Details

    • Similar Issues:

      Description

      When building in Kubernetes it is common to be building a docker image in a daemon less environment using img or kaniko. This is not compatible with gathering build information with the Artifactory plugin because it looks like the plugin requires the docker socket.

      When building an container image inside of the img project on Kubernetes:

      pipeline {
          agent {
              kubernetes {
                  defaultContainer 'test'
                  yaml """
                      apiVersion: v1
                      kind: Pod
                      metadata:
                        annotations:
                          container.apparmor.security.beta.kubernetes.io/img: unconfined
                          container.seccomp.security.alpha.kubernetes.io/img: unconfined
                      spec:
                        securityContext:
                          runAsUser: 1000
                          runAsGroup: 1000
                        containers:
                          - name: img
                            image: r.j3ss.co/img
                            imagePullPolicy: Always
                            command: [sh, -c, 'sleep 8h ; echo exiting due to timeout >&2']
                            tty: true
                            resources:
                              requests:
                                memory: 2Gi
                                cpu: 500m
                              limits:
                                memory: 2Gi
                                cpu: 2
                      """
              }
          }
          stages {
              stage('Build') {
                  steps {
                      script {
                          def artifactoryServer = Artifactory.server(<server-id>)
                          def artifactoryDocker = Artifactory.docker(server: artifactoryServer /*, host: "tcp://not-needed-because-using-daemonless:55555" */)
                          def artifactoryBuildInfo = Artifactory.newBuildInfo()
                          artifactoryDocker.push('test-image', 'docker-test-repo', artifactoryBuildInfo)
                      }
                  }
              }
          }
      }
      

      The following error is created:

      hudson.remoting.Channel$CallSiteStackTrace: Remote call to JNLP4-connect connection from ip-**********.ec2.internal/**********:*****
      		at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1743)
      		at hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:357)
      		at hudson.remoting.Channel.call(Channel.java:957)
      		at org.jfrog.hudson.pipeline.common.docker.utils.DockerAgentUtils.getImageIdFromAgent(DockerAgentUtils.java:291)
      		at org.jfrog.hudson.pipeline.common.executors.DockerExecutor.execute(DockerExecutor.java:59)
      		at org.jfrog.hudson.pipeline.scripted.steps.DockerPushStep$Execution.run(DockerPushStep.java:104)
      		at org.jfrog.hudson.pipeline.scripted.steps.DockerPushStep$Execution.run(DockerPushStep.java:71)
      		at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1$1.call(AbstractSynchronousNonBlockingStepExecution.java:47)
      		at hudson.security.ACL.impersonate(ACL.java:290)
      		at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1.run(AbstractSynchronousNonBlockingStepExecution.java:44)
      		at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
      		at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      		at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      		at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      java.io.FileNotFoundException
      	at io.netty.channel.unix.Errors.throwConnectException(Errors.java:110)
      	at io.netty.channel.unix.Socket.connect(Socket.java:257)
      	at io.netty.channel.epoll.AbstractEpollChannel.doConnect0(AbstractEpollChannel.java:728)
      	at io.netty.channel.epoll.AbstractEpollChannel.doConnect(AbstractEpollChannel.java:713)
      	at io.netty.channel.epoll.EpollDomainSocketChannel.doConnect(EpollDomainSocketChannel.java:87)
      	at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.connect(AbstractEpollChannel.java:555)
      	at io.netty.channel.DefaultChannelPipeline$HeadContext.connect(DefaultChannelPipeline.java:1366)
      	at io.netty.channel.AbstractChannelHandlerContext.invokeConnect(AbstractChannelHandlerContext.java:545)
      	at io.netty.channel.AbstractChannelHandlerContext.connect(AbstractChannelHandlerContext.java:530)
      	at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.connect(CombinedChannelDuplexHandler.java:497)
      	at io.netty.channel.ChannelOutboundHandlerAdapter.connect(ChannelOutboundHandlerAdapter.java:47)
      	at io.netty.channel.CombinedChannelDuplexHandler.connect(CombinedChannelDuplexHandler.java:298)
      	at io.netty.channel.AbstractChannelHandlerContext.invokeConnect(AbstractChannelHandlerContext.java:545)
      	at io.netty.channel.AbstractChannelHandlerContext.connect(AbstractChannelHandlerContext.java:530)
      	at io.netty.channel.AbstractChannelHandlerContext.connect(AbstractChannelHandlerContext.java:512)
      	at io.netty.channel.DefaultChannelPipeline.connect(DefaultChannelPipeline.java:1024)
      	at io.netty.channel.AbstractChannel.connect(AbstractChannel.java:259)
      	at io.netty.bootstrap.Bootstrap$3.run(Bootstrap.java:252)
      	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
      	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404)
      	at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:335)
      	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:897)
      	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
      	at java.lang.Thread.run(Thread.java:748)
      

      Is there any way to gather build information and push to the Artifactory docker repo other than through the docker socket that the plugin uses?

        Attachments

          Activity

          Hide
          j_luxworth Jesse S added a comment -

          Found a related article: https://jfrog.com/knowledge-base/why-doesnt-my-build-have-paths-to-published-artifacts-even-though-it-did-upload-them/

          Would this be the proper way to set the build info if I were to push it using the `img push docker-test-repo:test-image`?

          Show
          j_luxworth Jesse S added a comment - Found a related article: https://jfrog.com/knowledge-base/why-doesnt-my-build-have-paths-to-published-artifacts-even-though-it-did-upload-them/ Would this be the proper way to set the build info if I were to push it using the `img push docker-test-repo:test-image`?
          Hide
          j_luxworth Jesse S added a comment -
          Show
          j_luxworth Jesse S added a comment - Found that JFrog-cli support this https://github.com/jfrog/jfrog-cli/issues/804 -> https://github.com/jfrog/project-examples/tree/master/kaniko-example#prerequisites-for-running-this-example . Hoping this is on the roadmap for jfrog artifactory plugin!

            People

            Assignee:
            eyalbe Eyal Ben Moshe
            Reporter:
            j_luxworth Jesse S
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Dates

              Created:
              Updated: