[JIRA] [docker-workflow-plugin] (JENKINS-34276) docker.inside within a withRegistry block seems to use image.id instead of image.imageName()

58 views
Skip to first unread message

radesh.rao@gmail.com (JIRA)

unread,
Apr 15, 2016, 9:17:02 AM4/15/16
to jenkinsc...@googlegroups.com
Radesh Rao created an issue
 
Jenkins / Bug JENKINS-34276
docker.inside within a withRegistry block seems to use image.id instead of image.imageName()
Issue Type: Bug Bug
Assignee: Jesse Glick
Components: docker-workflow-plugin, workflow-plugin
Created: 2016/Apr/15 1:16 PM
Priority: Major Major
Reporter: Radesh Rao

I'm trying to execute a maven build inside of my custom container (my.registry.com/build-env:jdk8-maven3):

node('docker') {
     docker.withRegistry('https://my.registry.com', 'docker-registry-login') {
        def maven = docker.image("my-build-env:jdk8-maven3")
        
        sh "echo ${maven.imageName()} -- ${maven.id}"
        maven.pull()
        maven.inside() {
            sh "echo Hello"
        }
     }
}

It goes well until the pull, which uses the imageName (my.registry.com/build-env:jdk8-maven3) but the run command uses id (build-env:jdk8-maven3)

Abbreviated logs:

Started by user Radesh Rao
[Pipeline] Allocate node : Start
Running on docker in /data/jenkins/workspace/My pipeline
[Pipeline] node {
[Pipeline] Set environment variables : Start
[Pipeline] withEnv {
[Pipeline] Sets up Docker registry endpoint : Start
[Pipeline] withDockerRegistry {
[Pipeline] sh
[Cloud pipeline] Running shell script
+ echo my.registry.com/build-env:jdk8-maven3 -- build-env:jdk8-maven3
my.registry.com/build-env:jdk8-maven3 -- build-env:jdk8-maven3
[Pipeline] sh
[Cloud pipeline] Running shell script
+ docker inspect -f . build-env:jdk8-maven3

Error: No such image or container: build-env:jdk8-maven3
[Pipeline] sh
[Cloud pipeline] Running shell script
+ docker pull my.registry.com/build-env:jdk8-maven3
jdk8-maven3: Pulling from build-env
fdd5d7827f33: Pulling fs layer
// ....
// snip
// ....
416e801cfa37: Pull complete
Digest: sha256:cadb8d0e48a2dc98d1c88f633b8ac226d5df00ffeaa66d3522b02dfdd055351b
Status: Downloaded newer image for my.registry.com/build-env:jdk8-maven3
[Pipeline] Run build steps inside a Docker container : Start
$ docker run -t -d -u 995:991 -w "/data/jenkins/workspace/My pipeline" -v "/data/jenkins/workspace/My pipeline:/data/jenkins/workspace/My pipeline:rw" -v "/data/jenkins/workspace/My pipeline@tmp:/data/jenkins/workspace/My pipeline@tmp:rw" -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** build-env:jdk8-maven3 cat
[Pipeline] Run build steps inside a Docker container : End
[Pipeline] } //withDockerRegistry
[Pipeline] Sets up Docker registry endpoint : End
[Pipeline] } //withEnv
[Pipeline] Set environment variables : End
[Pipeline] } //node
[Pipeline] Allocate node : End
[Pipeline] End of Pipeline
java.io.IOException: Failed to run image 'build-env:jdk8-maven3'. Error: Unable to find image 'build-env:jdk8-maven3' locally
docker: Error response from daemon: Authentication is required: Get https://registry-1.docker.io/v2/library/build-env/manifests/jdk8-maven3: unauthorized: incorrect username or password.
See 'docker run --help'.
	at org.jenkinsci.plugins.docker.workflow.client.DockerClient.run(DockerClient.java:112)
	at org.jenkinsci.plugins.docker.workflow.WithContainerStep$Execution.start(WithContainerStep.java:145)
	at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:136)
	at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:113)
	at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:45)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
	at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:15)
	at org.jenkinsci.plugins.docker.workflow.Docker$Image.inside(jar:file:/var/lib/jenkins/plugins/docker-workflow/WEB-INF/lib/docker-workflow.jar!/org/jenkinsci/plugins/docker/workflow/Docker.groovy:112)
	at org.jenkinsci.plugins.docker.workflow.Docker.node(jar:file:/var/lib/jenkins/plugins/docker-workflow/WEB-INF/lib/docker-workflow.jar!/org/jenkinsci/plugins/docker/workflow/Docker.groovy:63)
	at org.jenkinsci.plugins.docker.workflow.Docker$Image.inside(jar:file:/var/lib/jenkins/plugins/docker-workflow/WEB-INF/lib/docker-workflow.jar!/org/jenkinsci/plugins/docker/workflow/Docker.groovy:104)
	at WorkflowScript.run(WorkflowScript:10)
	at org.jenkinsci.plugins.docker.workflow.Docker.withRegistry(jar:file:/var/lib/jenkins/plugins/docker-workflow/WEB-INF/lib/docker-workflow.jar!/org/jenkinsci/plugins/docker/workflow/Docker.groovy:38)
	at ___cps.transform___(Native Method)
	at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:55)
	at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:106)
	at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:79)
	at sun.reflect.GeneratedMethodAccessor518.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
	at com.cloudbees.groovy.cps.impl.ClosureBlock.eval(ClosureBlock.java:40)
	at com.cloudbees.groovy.cps.Next.step(Next.java:58)
	at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:154)
	at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:164)
	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:277)
	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$000(CpsThreadGroup.java:77)
	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:186)
	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:184)
	at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:47)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
	at java.util.concurrent.FutureTask.run(FutureTask.java:166)
	at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112)
	at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
	at java.util.concurrent.FutureTask.run(FutureTask.java:166)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:724)
Finished: FAILURE
Add Comment Add Comment
 
This message was sent by Atlassian JIRA (v6.4.2#64017-sha1:e244265)
Atlassian logo

jglick@cloudbees.com (JIRA)

unread,
Apr 19, 2016, 11:37:01 AM4/19/16
to jenkinsc...@googlegroups.com

jglick@cloudbees.com (JIRA)

unread,
Apr 19, 2016, 12:18:01 PM4/19/16
to jenkinsc...@googlegroups.com
Jesse Glick commented on Bug JENKINS-34276
 
Re: docker.inside within a withRegistry block seems to use image.id instead of image.imageName()

Proposed patch:

diff --git a/src/main/resources/org/jenkinsci/plugins/docker/workflow/Docker.groovy b/src/main/resources/org/jenkinsci/plugins/docker/workflow/Docker.groovy
index 5842ed5..6a84158 100644
--- a/src/main/resources/org/jenkinsci/plugins/docker/workflow/Docker.groovy
+++ b/src/main/resources/org/jenkinsci/plugins/docker/workflow/Docker.groovy
@@ -109,7 +109,7 @@ class Docker implements Serializable {
                     // withDockerContainer requires the image to be available locally, since its start phase is not a durable task.
                     pull()
                 }
-                docker.script.withDockerContainer(image: id, args: args, toolName: docker.script.env.DOCKER_TOOL_NAME) {
+                docker.script.withDockerContainer(image: imageName(), args: args, toolName: docker.script.env.DOCKER_TOOL_NAME) {
                     body()
                 }
             }

but need to figure out how to reproduce the problem to verify the fix.

radesh.rao@gmail.com (JIRA)

unread,
Apr 19, 2016, 2:14:01 PM4/19/16
to jenkinsc...@googlegroups.com

radesh.rao@gmail.com (JIRA)

unread,
Apr 19, 2016, 3:21:01 PM4/19/16
to jenkinsc...@googlegroups.com

The test job that I had succeeds with the patch:

Started by user Radesh Rao
[Pipeline] Allocate node : Start
Running on docker in /data/jenkins/workspace/My pipeline
[Pipeline] node {
[Pipeline] Set environment variables : Start
[Pipeline] withEnv {
[Pipeline] Sets up Docker registry endpoint : Start
[Pipeline] withDockerRegistry {
[Pipeline] sh
[Cloud pipeline] Running shell script
+ echo my.registry.com/build-env:jdk8-maven3 -- build-env:jdk8-maven3
my.registry.com/build-env:jdk8-maven3 -- build-env:jdk8-maven3
[Pipeline] sh
[Cloud pipeline] Running shell script
+ docker inspect -f . build-env:jdk8-maven3

Error: No such image or container: build-env:jdk8-maven3
[Pipeline] sh
[Cloud pipeline] Running shell script
+ docker pull my.registry.com/build-env:jdk8-maven3
jdk8-maven3: Pulling from build-env
// ....
// snip
// ....
Status: Image is up to date for my.registry.com/build-env:jdk8-maven3
[Pipeline] Run build steps inside a Docker container : Start
$ docker run -t -d -u 995:991 -w "/data/jenkins/workspace/My pipeline" -v "/data/jenkins/workspace/My pipeline:/data/jenkins/workspace/My pipeline:rw" -v "/data/jenkins/workspace/My pipeline@tmp:/data/jenkins/workspace/My pipeline@tmp:rw" -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** my.registry.com/build-env:jdk8-maven3 cat
[Pipeline] withDockerContainer {
[Pipeline] sh
[Cloud pipeline] Running shell script
+ echo Hello
Hello
[Pipeline] } //withDockerContainer
$ docker stop a9bf6ced0bceb9731144db9d639ae702587238d67ad5af55107dec5e5ad54333
$ docker rm -f a9bf6ced0bceb9731144db9d639ae702587238d67ad5af55107dec5e5ad54333
[Pipeline] Run build steps inside a Docker container : End
[Pipeline] } //withDockerRegistry
[Pipeline] Sets up Docker registry endpoint : End
[Pipeline] } //withEnv
[Pipeline] Set environment variables : End
[Pipeline] } //node
[Pipeline] Allocate node : End
[Pipeline] End of Pipeline
Finished: SUCCESS

arthur.vanduynhoven@gmail.com (JIRA)

unread,
May 10, 2016, 9:31:02 AM5/10/16
to jenkinsc...@googlegroups.com
Art V commented on Bug JENKINS-34276

Same type of issue when using withRegistry and image.run() command. It uses the ID and not the imageName() so fails to find the image from the private registry. Should be same type of fix as this.

dweomer5@gmail.com (JIRA)

unread,
May 25, 2016, 2:09:02 PM5/25/16
to jenkinsc...@googlegroups.com
h2. Steps to Reproduce for [~jglick]:
# h4. Build image {{example/jenkins-34276:latest}} private repository {{repo.example.com:5000}}
# h4. Verify you can pull this image from your Jenkins slave, e.g.:
{code}
docker pull repo.example.com:5000/example/jenkins-34276:latest
{code}
# h4. Attempt to access image with the below pipeline snippet (assumes credentials {{anonymous}} exist are allowed to pull from the private repo):
{code}
node ('build && docker') {
    docker.withRegistry('https://repo.example.com:5000', 'anonymous') {
        def exampleImg = docker.image('example/jenkins-34276)
        exampleImg.pull() // make sure the image is up-to-date
        exampleImg.inside {
            sh 'env | sort'
        }
    }
}
{code}
# h5
.  Witness failure as below:
{code}
Started by user Jacob Blain Christen
[Pipeline] node
Running on build-507941e0b4db in /var/lib/jenkins/workspace/JCHRISTEN/docker-inside
[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] withDockerRegistry
[Pipeline] {
[Pipeline] sh
[docker-inside] Running shell script
+ docker pull repo.example.com:5000/example/jenkins-34276
Using default tag: latest
latest: Pulling from example/jenkins-34276
6599cadaf950: Already exists
23eda618d451: Already exists
f0be3084efe9: Already exists
52de432f084b: Already exists
a3ed95caeb02: Already exists
79ea8cd5fef8: Already exists
b5b96651da0d: Pulling fs layer
945ed45a59ec: Pulling fs layer
f720300846de: Pulling fs layer
80e10de1adee: Pulling fs layer
80e10de1adee: Waiting
f720300846de: Verifying Checksum
f720300846de: Download complete
80e10de1adee: Verifying Checksum
80e10de1adee: Download complete
b5b96651da0d: Verifying Checksum
b5b96651da0d: Download complete
945ed45a59ec: Verifying Checksum
945ed45a59ec: Download complete
b5b96651da0d: Pull complete
b5b96651da0d: Pull complete
945ed45a59ec: Pull complete
945ed45a59ec: Pull complete
f720300846de: Pull complete
f720300846de: Pull complete
80e10de1adee: Pull complete
80e10de1adee: Pull complete
Digest: sha256:c526a65b8bd1a7e68a7376a1b53e0880d6955f9a7aa29d8df56b5a8fac9b8537
Status: Downloaded newer image for repo.example.com:5000/example/jenkins-34276:latest
[Pipeline] sh
[docker-inside] Running shell script
+ docker inspect -f . example/jenkins-34276

Error: No such image or container: example/jenkins-34276
[Pipeline] sh
[docker-inside] Running shell script
+ docker pull repo.example.com:5000/example/jenkins-34276
Using default tag: latest
latest: Pulling from example/jenkins-34276
Digest: sha256:c526a65b8bd1a7e68a7376a1b53e0880d6955f9a7aa29d8df56b5a8fac9b8537
Status: Image is up to date for repo.example.com:5000/example/jenkins-34276:latest
[Pipeline] withDockerContainer
$ docker run -t -d -u 1000:1000 -w /var/lib/jenkins/workspace/JCHRISTEN/docker-inside -v /var/lib/jenkins/workspace/JCHRISTEN/docker-inside:/var/lib/jenkins/workspace/JCHRISTEN/docker-inside:rw -v /var/lib/jenkins/workspace/JCHRISTEN/docker-inside@tmp:/var/lib/jenkins/workspace/JCHRISTEN/docker-inside@tmp:rw -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** example/jenkins-34276 cat
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // withDockerRegistry
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
java.io.IOException: Failed to run image 'example/jenkins-34276'. Error: Unable to find image 'example/jenkins-34276:latest' locally
Pulling repository docker.io/example/jenkins-34276
docker: Error: image example/jenkins-34276 not found.

See 'docker run --help'.
at org.jenkinsci.plugins.docker.workflow.client.DockerClient.run(DockerClient.java:112)
at org.jenkinsci.plugins.docker.workflow.WithContainerStep$Execution.start(WithContainerStep.java:145)
at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:137)
at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:113)
at groovy.lang.GroovyObject$invokeMethod.call(Unknown Source)

at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:151)
at org.kohsuke.groovy.sandbox.GroovyInterceptor.onMethodCall(GroovyInterceptor.java:21)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:115)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:103)
at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:149)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:146)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:15)
at org.jenkinsci.plugins.docker.workflow.Docker$Image.inside(jar:file:/var/jenkins_home/plugins/docker-workflow/WEB-INF/lib/docker-workflow.jar!/org/jenkinsci/plugins/docker/workflow/Docker.groovy:112)
at org.jenkinsci.plugins.docker.workflow.Docker.node(jar:file:/var/jenkins_home/plugins/docker-workflow/WEB-INF/lib/docker-workflow.jar!/org/jenkinsci/plugins/docker/workflow/Docker.groovy:63)
at org.jenkinsci.plugins.docker.workflow.Docker$Image.inside(jar:file:/var/jenkins_home/plugins/docker-workflow/WEB-INF/lib/docker-workflow.jar!/org/jenkinsci/plugins/docker/workflow/Docker.groovy:104)
at WorkflowScript.run(WorkflowScript:14)
at org.jenkinsci.plugins.docker.workflow.Docker.withRegistry(jar:file:/var/jenkins_home/plugins/docker-workflow/WEB-INF/lib/docker-workflow.jar!/org/jenkinsci/plugins/docker/workflow/Docker.groovy:38)

at ___cps.transform___(Native Method)
at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:55)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:106)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:79)
at sun.reflect.GeneratedMethodAccessor709.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)

at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
at com.cloudbees.groovy.cps.impl.ClosureBlock.eval(ClosureBlock.java:40)
at com.cloudbees.groovy.cps.Next.step(Next.java:58)
at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:154)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:19)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:33)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:30)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:108)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:30)
at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:164)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:276)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$000(CpsThreadGroup.java:78)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:185)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:183)
at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:47)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)

at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112)
at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
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:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Finished: FAILURE
{code}

dweomer5@gmail.com (JIRA)

unread,
May 25, 2016, 2:09:03 PM5/25/16
to jenkinsc...@googlegroups.com
h2. Steps to Reproduce for [~jglick]:
#  h4  h5 . Build image {{example/jenkins-34276:latest}} private repository {{repo.example.com:5000}}
#
 h4  h5 . Verify you can pull this image from your Jenkins slave, e.g.:
#  h4  h5 . Attempt to access image with the below pipeline snippet (assumes credentials {{anonymous}} exist are allowed to pull from the private repo):

{code}
node ('build && docker') {
    docker.withRegistry('https://repo.example.com:5000', 'anonymous') {
        def exampleImg = docker.image('example/jenkins-34276)
        exampleImg.pull() // make sure the image is up-to-date
        exampleImg.inside {
            sh 'env | sort'
        }
    }
}
{code}
# h5. Witness failure as below:

dweomer5@gmail.com (JIRA)

unread,
May 25, 2016, 2:12:03 PM5/25/16
to jenkinsc...@googlegroups.com
h2 h3 . Steps to Reproduce for [~jglick]:
# h5. Build image {{example/jenkins-34276:latest}} private repository {{repo.example.com:5000}}
# h5. Verify you can pull this image from your Jenkins slave, e.g.:
# h5. Attempt to access image with the below pipeline snippet (assumes credentials {{anonymous}} exist are allowed to pull from the private repo):


h3. Current work-around

node ('build && docker') {
    docker.withRegistry('https://repo.example.com:5000', 'anonymous') {
        def exampleImg = docker.image('example/jenkins-34276)
        exampleImg.pull() // make sure the image is up-to-date
        docker.image(exampleImg.imageName()).inside {
            sh 'env | sort'
        }
    }
}

dweomer5@gmail.com (JIRA)

unread,
May 25, 2016, 2:20:27 PM5/25/16
to jenkinsc...@googlegroups.com

Steps to Reproduce for Jesse Glick:

    1. Build image example/jenkins-34276:latest private repository repo.example.com:5000

    1. Verify you can pull this image from your Jenkins slave, e.g.:

    1. Attempt to access image with the below pipeline snippet (assumes credentials anonymous exist are allowed to pull from the private repo):

    1. node ('build && docker') {
          docker.withRegistry('https://repo.example.com:5000', 'anonymous') {
      
    1.         def exampleImg = docker.image('example/jenkins-34276)
              exampleImg.pull() // make sure the image is up-to-date
              exampleImg.inside {
                  sh 'env | sort'
              }
          }
      }
      
    1.  
                                                              
    2. h5 Witness failure as below:

    dweomer5@gmail.com (JIRA)

    unread,
    May 25, 2016, 2:25:23 PM5/25/16
    to jenkinsc...@googlegroups.com
    h3. Steps to Reproduce for [~jglick]:
    # h5. Build image {{example/jenkins-34276:latest}} private repository {{repo.example.com:5000}}
    # h5. Verify you can pull this image from your Jenkins slave, e.g.:
    {code}
    {code}
    # h5. Attempt to access image with the below pipeline snippet (assumes credentials {{anonymous}} exist are allowed to pull from the private repo):
    {code}

    node ('build && docker') {
        docker.withRegistry('https://repo.example.com:5000', 'anonymous') {
            def exampleImg = docker.image('example/jenkins-34276)
            exampleImg.pull() // make sure the image is up-to-date
            exampleImg.inside {
                sh 'env | sort'
            }
        }
    }
    {code}
    # h5. Witness failure as below:
    {code}
    {code}

    h3. Current work-around
    {code}
    node ('build && docker') {
        docker.withRegistry('https://repo.example.com:5000', 'anonymous') {
            def exampleImg = docker.image('example/jenkins-34276)
            exampleImg.pull() // make sure the image is up-to-date
            docker.image(exampleImg.imageName()).inside {
                sh 'env | sort'
            }
        }
    }

    {code}

    jglick@cloudbees.com (JIRA)

    unread,
    Jul 26, 2016, 12:35:02 PM7/26/16
    to jenkinsc...@googlegroups.com
    Jesse Glick started work on Bug JENKINS-34276
     
    Change By: Jesse Glick
    Status: Open In Progress
    This message was sent by Atlassian JIRA (v7.1.7#71011-sha1:2526d7c)
    Atlassian logo

    jenkins@richardlee.name (JIRA)

    unread,
    Aug 31, 2016, 6:58:02 PM8/31/16
    to jenkinsc...@googlegroups.com

    Same problem. The
    {{
    myImage.pull()
    docker.image(myImage.imageName()).inside()
    }}
    workaround for
    {{
    myImage.inside()
    }}
    seems to get around the bug, tho.

    jenkins@richardlee.name (JIRA)

    unread,
    Aug 31, 2016, 6:59:06 PM8/31/16
    to jenkinsc...@googlegroups.com
    Richard Lee edited a comment on Bug JENKINS-34276

    jenkins@richardlee.name (JIRA)

    unread,
    Aug 31, 2016, 6:59:11 PM8/31/16
    to jenkinsc...@googlegroups.com

    jenkins@richardlee.name (JIRA)

    unread,
    Aug 31, 2016, 7:01:03 PM8/31/16
    to jenkinsc...@googlegroups.com
    Richard Lee edited a comment on Bug JENKINS-34276
    Same problem.  The
    ` {quote}
    myImage.pull()
    docker.image(myImage.imageName()).inside()
    ` {quote}
    workaround for
    ` {quote}
    myImage.inside()
    ` {quote}
    seems to get around the bug, tho.

    jglick@cloudbees.com (JIRA)

    unread,
    Dec 8, 2016, 3:45:01 PM12/8/16
    to jenkinsc...@googlegroups.com

    I managed to reproduce the problem in a job based on the demo job, but the patch is not as simple as I thought, because an image might be either a local name (for example returned from Docker.build) or a remote name with registry. The originally proposed patch actually breaks the stock demo.

    jglick@cloudbees.com (JIRA)

    unread,
    Dec 8, 2016, 4:00:07 PM12/8/16
    to jenkinsc...@googlegroups.com

    Alternately, perhaps the intention is that when using a registry, all local image names include the prefix, starting with build -t. The documentation is unclear on best practices.

    jglick@cloudbees.com (JIRA)

    unread,
    Dec 8, 2016, 4:16:06 PM12/8/16
    to jenkinsc...@googlegroups.com

    arthur.vanduynhoven@gmail.com (JIRA)

    unread,
    Dec 9, 2016, 4:33:02 AM12/9/16
    to jenkinsc...@googlegroups.com
    Art V commented on Bug JENKINS-34276
     
    Re: docker.inside within a withRegistry block seems to use image.id instead of image.imageName()

    If this helps anyone, for the last few months I've been running with these changes to the plugin to work around this issue..

    diff --git a/src/main/resources/org/jenkinsci/plugins/docker/workflow/Docker.groovy b/src/main/resources/org/jenkinsci/plugins/docker/workflow/Docker.groovy
    index 196ee39..13ac834 100644
    --- a/src/main/resources/org/jenkinsci/plugins/docker/workflow/Docker.groovy
    +++ b/src/main/resources/org/jenkinsci/plugins/docker/workflow/Docker.groovy
    @@ -86,9 +86,10 @@ class Docker implements Serializable {
                     }
                 }
    
    -            script.sh "docker build -t ${image} ${args}"
    -            script.dockerFingerprintFrom dockerfile: dockerfile, image: image, toolName: script.env.DOCKER_TOOL_NAME
    -            this.image(image)
    +            def buildImage = this.image(image)
    +            script.sh "docker build -t ${buildImage.imageName()} ${args}"
    +            script.dockerFingerprintFrom dockerfile: dockerfile, image: buildImage.imageName(), toolName: script.env.DOCKER_TOOL_NAME
    +            buildImage
             }
         }
    
    @@ -114,12 +115,12 @@ class Docker implements Serializable {
    
             public <V> V inside(String args = '', Closure<V> body) {
                 docker.node {
    -                if (docker.script.sh(script: "docker inspect -f . ${id}", returnStatus: true) != 0) {
    +                if (docker.script.sh(script: "docker inspect -f . ${imageName()}", returnStatus: true) != 0) {
                         // Not yet present locally.
    
                         // withDockerContainer requires the image to be available locally, since its start phase is not a durable task.
    
                         pull()
                     }
    -                docker.script.withDockerContainer(image: id, args: args, toolName: docker.script.env.DOCKER_TOOL_NAME) {
    +                docker.script.withDockerContainer(image: imageName(), args: args, toolName: docker.script.env.DOCKER_TOOL_NAME) {
                         body()
                     }
                 }
    @@ -133,7 +134,7 @@ class Docker implements Serializable {
    
             public Container run(String args = '', String command = "") {
                 docker.node {
    -                def container = docker.script.sh(script: "docker run -d${args != '' ? ' ' + args : ''} ${id}${command != '' ? ' ' + command : ''}", returnStdout: true).trim()
    +                def container = docker.script.sh(script: "docker run -d${args != '' ? ' ' + args : ''} ${imageName()}${command != '' ? ' ' + command : ''}", returnStdout: true).trim()
                     docker.script.dockerFingerprintRun containerId: container, toolName: docker.script.env.DOCKER_TOOL_NAME
                     new Container(docker, container)
                 }
    @@ -154,7 +155,7 @@ class Docker implements Serializable {
                 docker.node {
                     def taggedImageName = toQualifiedImageName(parsedId.userAndRepo + ':' + tagName)
                     // TODO as of 1.10.0 --force is deprecated; for 1.12+ do not try it even once
    -                docker.script.sh "docker tag --force=${force} ${id} ${taggedImageName} || docker tag ${id} ${taggedImageName}"
    +                docker.script.sh "docker tag --force=${force} ${imageName()} ${taggedImageName} || docker tag ${imageName()} ${taggedImageName}"
                     return taggedImageName;
                 }
             }
    

    jglick@cloudbees.com (JIRA)

    unread,
    Dec 15, 2016, 3:23:02 PM12/15/16
    to jenkinsc...@googlegroups.com

    scm_issue_link@java.net (JIRA)

    unread,
    Dec 16, 2016, 3:00:02 PM12/16/16
    to jenkinsc...@googlegroups.com
    SCM/JIRA link daemon commented on Bug JENKINS-34276
     
    Re: docker.inside within a withRegistry block seems to use image.id instead of image.imageName()

    Code changed in jenkins
    User: Jesse Glick
    Path:
    demo/JENKINS_HOME/jobs/puller/config.xml
    demo/plugins.txt
    src/main/resources/org/jenkinsci/plugins/docker/workflow/Docker.groovy
    http://jenkins-ci.org/commit/docker-workflow-plugin/417acf3af06e277071b87a7fec065d6dc50fdcad
    Log:
    [FIXED JENKINS-34276] Allow Image.inside to run with either a local or registry-prefixed name.

    Reply all
    Reply to author
    Forward
    0 new messages