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

Jenkins docker plugin global variables override image arguments

    • Icon: New Feature New Feature
    • Resolution: Unresolved
    • Icon: Minor Minor
    • docker-workflow-plugin
    • None
    • Jenkins 2.222.4

      If a global environment variable is defined it is not possible to override it with arguments passed in to the docker.image(...).inside(...) step. It appears to be because environment variables from the process added to the docker launch arguments after any user specified arguments here.

      The solution could simply be to put user args last assuming it's okay / secure for users to have the ability to override any of the automatically injected arguments.

      To reproduce:

      1. Create a global environment variable MY_VAR=value1
      2. Create a pipeline job with the following script that sets MY_VAR=value2 as an image arguments
        • pipeline {
              agent {
                  label "docker"
              }
          
              stages {
                  stage('Build') {
                      steps {
                          script {
                              docker.image('<image>').inside('-e MY_VAR=value2') { 
                                  sh 'env | grep MY_VAR'
                              }
                          }
                      }
                  }
              }
          }
          
      1. Observe the result. It prints MY_VAR=value1 instead of MY_VAR=value2
        14:55:39  [Pipeline] withDockerContainer
        14:55:39  jknn2t-mdjrvo does not seem to be running inside a container
        14:55:39  $ docker run -t -d -u 78572:20 -e MY_VAR=value2 -w /var/appl/jenkins/workspace/sle/mrichar2_var_ordering -v /var/appl/jenkins/workspace/sle/mrichar2_var_ordering:/var/appl/jenkins/workspace/sle/mrichar2_var_ordering:rw,z -v /var/appl/jenkins/workspace/sle/mrichar2_var_ordering@tmp:/var/appl/jenkins/workspace/sle/mrichar2_var_ordering@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** <image> cat
        14:55:39  $ docker top 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659 -eo pid,comm
        14:55:39  [Pipeline] {
        14:55:39  [Pipeline] sh
        14:55:40  + env
        14:55:40  + grep MY_VAR
        14:55:40  MY_VAR=value1
        14:55:40  [Pipeline] }
        14:55:40  $ docker stop --time=1 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659
        14:55:41  $ docker rm -f 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659
        14:55:41  [Pipeline] // withDockerContainer
        14:55:41  [Pipeline] }
        14:55:41  [Pipeline] // script
        14:55:41  [Pipeline] }
        14:55:41  [Pipeline] // stage
        14:55:41  [Pipeline] }
        14:55:41  [Pipeline] // node
        14:55:41  [Pipeline] End of Pipeline
        

          [JENKINS-64597] Jenkins docker plugin global variables override image arguments

          Mark R created issue -
          Mark R made changes -
          Link New: This issue relates to JENKINS-54767 [ JENKINS-54767 ]
          Mark R made changes -
          Description Original: If a global environment variable is defined it is not possible to override it with arguments passed in to the docker.image(...).inside(...) step. It appears to be because environment variables from the process added to the docker launch arguments after any user specified arguments [here](https://github.com/jenkinsci/docker-workflow-plugin/blob/master/src/main/java/org/jenkinsci/plugins/docker/workflow/client/DockerClient.java#L135)

          To reproduce:
          # Create a global environment variable MY_VAR=value1
          # Create a pipeline job with the following script that sets MY_VAR=value2 as an image arguments
          #-
          {code:java}
          pipeline {
              agent {
                  label "docker"
              }

              stages {
                  stage('Build') {
                      steps {
                          script {
                              docker.image('<image>').inside('-e MY_VAR=value2') {
                                  sh 'env | grep MY_VAR'
                              }
                          }
                      }
                  }
              }
          }
          {code}

          {noformat}
          # Observe the result. It prints MY_VAR=value1 instead of MY_VAR=value2
          14:55:39 [Pipeline] withDockerContainer
          14:55:39 jknn2t-mdjrvo does not seem to be running inside a container
          14:55:39 $ docker run -t -d -u 78572:20 -e MY_VAR=value2 -w /var/appl/jenkins/workspace/sle/mrichar2_var_ordering -v /var/appl/jenkins/workspace/sle/mrichar2_var_ordering:/var/appl/jenkins/workspace/sle/mrichar2_var_ordering:rw,z -v /var/appl/jenkins/workspace/sle/mrichar2_var_ordering@tmp:/var/appl/jenkins/workspace/sle/mrichar2_var_ordering@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** <image> cat
          14:55:39 $ docker top 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659 -eo pid,comm
          14:55:39 [Pipeline] {
          14:55:39 [Pipeline] sh
          14:55:40 + env
          14:55:40 + grep MY_VAR
          14:55:40 MY_VAR=value1
          14:55:40 [Pipeline] }
          14:55:40 $ docker stop --time=1 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659
          14:55:41 $ docker rm -f 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659
          14:55:41 [Pipeline] // withDockerContainer
          14:55:41 [Pipeline] }
          14:55:41 [Pipeline] // script
          14:55:41 [Pipeline] }
          14:55:41 [Pipeline] // stage
          14:55:41 [Pipeline] }
          14:55:41 [Pipeline] // node
          14:55:41 [Pipeline] End of Pipeline
          {noformat}

          New: If a global environment variable is defined it is not possible to override it with arguments passed in to the docker.image(...).inside(...) step. It appears to be because environment variables from the process added to the docker launch arguments after any user specified arguments [here|https://github.com/jenkinsci/docker-workflow-plugin/blob/master/src/main/java/org/jenkinsci/plugins/docker/workflow/client/DockerClient.java#L135]

          To reproduce:
          # Create a global environment variable MY_VAR=value1
          # Create a pipeline job with the following script that sets MY_VAR=value2 as an image arguments
          #-
          {code:java}
          pipeline {
              agent {
                  label "docker"
              }

              stages {
                  stage('Build') {
                      steps {
                          script {
                              docker.image('<image>').inside('-e MY_VAR=value2') {
                                  sh 'env | grep MY_VAR'
                              }
                          }
                      }
                  }
              }
          }
          {code}

          {noformat}
          # Observe the result. It prints MY_VAR=value1 instead of MY_VAR=value2
          14:55:39 [Pipeline] withDockerContainer
          14:55:39 jknn2t-mdjrvo does not seem to be running inside a container
          14:55:39 $ docker run -t -d -u 78572:20 -e MY_VAR=value2 -w /var/appl/jenkins/workspace/sle/mrichar2_var_ordering -v /var/appl/jenkins/workspace/sle/mrichar2_var_ordering:/var/appl/jenkins/workspace/sle/mrichar2_var_ordering:rw,z -v /var/appl/jenkins/workspace/sle/mrichar2_var_ordering@tmp:/var/appl/jenkins/workspace/sle/mrichar2_var_ordering@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** <image> cat
          14:55:39 $ docker top 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659 -eo pid,comm
          14:55:39 [Pipeline] {
          14:55:39 [Pipeline] sh
          14:55:40 + env
          14:55:40 + grep MY_VAR
          14:55:40 MY_VAR=value1
          14:55:40 [Pipeline] }
          14:55:40 $ docker stop --time=1 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659
          14:55:41 $ docker rm -f 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659
          14:55:41 [Pipeline] // withDockerContainer
          14:55:41 [Pipeline] }
          14:55:41 [Pipeline] // script
          14:55:41 [Pipeline] }
          14:55:41 [Pipeline] // stage
          14:55:41 [Pipeline] }
          14:55:41 [Pipeline] // node
          14:55:41 [Pipeline] End of Pipeline
          {noformat}

          Mark R made changes -
          Description Original: If a global environment variable is defined it is not possible to override it with arguments passed in to the docker.image(...).inside(...) step. It appears to be because environment variables from the process added to the docker launch arguments after any user specified arguments [here|https://github.com/jenkinsci/docker-workflow-plugin/blob/master/src/main/java/org/jenkinsci/plugins/docker/workflow/client/DockerClient.java#L135]

          To reproduce:
          # Create a global environment variable MY_VAR=value1
          # Create a pipeline job with the following script that sets MY_VAR=value2 as an image arguments
          #-
          {code:java}
          pipeline {
              agent {
                  label "docker"
              }

              stages {
                  stage('Build') {
                      steps {
                          script {
                              docker.image('<image>').inside('-e MY_VAR=value2') {
                                  sh 'env | grep MY_VAR'
                              }
                          }
                      }
                  }
              }
          }
          {code}

          {noformat}
          # Observe the result. It prints MY_VAR=value1 instead of MY_VAR=value2
          14:55:39 [Pipeline] withDockerContainer
          14:55:39 jknn2t-mdjrvo does not seem to be running inside a container
          14:55:39 $ docker run -t -d -u 78572:20 -e MY_VAR=value2 -w /var/appl/jenkins/workspace/sle/mrichar2_var_ordering -v /var/appl/jenkins/workspace/sle/mrichar2_var_ordering:/var/appl/jenkins/workspace/sle/mrichar2_var_ordering:rw,z -v /var/appl/jenkins/workspace/sle/mrichar2_var_ordering@tmp:/var/appl/jenkins/workspace/sle/mrichar2_var_ordering@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** <image> cat
          14:55:39 $ docker top 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659 -eo pid,comm
          14:55:39 [Pipeline] {
          14:55:39 [Pipeline] sh
          14:55:40 + env
          14:55:40 + grep MY_VAR
          14:55:40 MY_VAR=value1
          14:55:40 [Pipeline] }
          14:55:40 $ docker stop --time=1 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659
          14:55:41 $ docker rm -f 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659
          14:55:41 [Pipeline] // withDockerContainer
          14:55:41 [Pipeline] }
          14:55:41 [Pipeline] // script
          14:55:41 [Pipeline] }
          14:55:41 [Pipeline] // stage
          14:55:41 [Pipeline] }
          14:55:41 [Pipeline] // node
          14:55:41 [Pipeline] End of Pipeline
          {noformat}

          New: If a global environment variable is defined it is not possible to override it with arguments passed in to the docker.image(...).inside(...) step. It appears to be because environment variables from the process added to the docker launch arguments after any user specified arguments [here|https://github.com/jenkinsci/docker-workflow-plugin/blob/master/src/main/java/org/jenkinsci/plugins/docker/workflow/client/DockerClient.java#L135].

          The solution could simply be to put user args last assuming it's okay / secure for users to have the ability to override any of the automatically injected arguments.

          To reproduce:
          # Create a global environment variable MY_VAR=value1
          # Create a pipeline job with the following script that sets MY_VAR=value2 as an image arguments
          #-
          {code:java}
          pipeline {
              agent {
                  label "docker"
              }

              stages {
                  stage('Build') {
                      steps {
                          script {
                              docker.image('<image>').inside('-e MY_VAR=value2') {
                                  sh 'env | grep MY_VAR'
                              }
                          }
                      }
                  }
              }
          }
          {code}

          {noformat}
          # Observe the result. It prints MY_VAR=value1 instead of MY_VAR=value2
          14:55:39 [Pipeline] withDockerContainer
          14:55:39 jknn2t-mdjrvo does not seem to be running inside a container
          14:55:39 $ docker run -t -d -u 78572:20 -e MY_VAR=value2 -w /var/appl/jenkins/workspace/sle/mrichar2_var_ordering -v /var/appl/jenkins/workspace/sle/mrichar2_var_ordering:/var/appl/jenkins/workspace/sle/mrichar2_var_ordering:rw,z -v /var/appl/jenkins/workspace/sle/mrichar2_var_ordering@tmp:/var/appl/jenkins/workspace/sle/mrichar2_var_ordering@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** <image> cat
          14:55:39 $ docker top 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659 -eo pid,comm
          14:55:39 [Pipeline] {
          14:55:39 [Pipeline] sh
          14:55:40 + env
          14:55:40 + grep MY_VAR
          14:55:40 MY_VAR=value1
          14:55:40 [Pipeline] }
          14:55:40 $ docker stop --time=1 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659
          14:55:41 $ docker rm -f 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659
          14:55:41 [Pipeline] // withDockerContainer
          14:55:41 [Pipeline] }
          14:55:41 [Pipeline] // script
          14:55:41 [Pipeline] }
          14:55:41 [Pipeline] // stage
          14:55:41 [Pipeline] }
          14:55:41 [Pipeline] // node
          14:55:41 [Pipeline] End of Pipeline
          {noformat}

          Mark R made changes -
          Description Original: If a global environment variable is defined it is not possible to override it with arguments passed in to the docker.image(...).inside(...) step. It appears to be because environment variables from the process added to the docker launch arguments after any user specified arguments [here|https://github.com/jenkinsci/docker-workflow-plugin/blob/master/src/main/java/org/jenkinsci/plugins/docker/workflow/client/DockerClient.java#L135].

          The solution could simply be to put user args last assuming it's okay / secure for users to have the ability to override any of the automatically injected arguments.

          To reproduce:
          # Create a global environment variable MY_VAR=value1
          # Create a pipeline job with the following script that sets MY_VAR=value2 as an image arguments
          #-
          {code:java}
          pipeline {
              agent {
                  label "docker"
              }

              stages {
                  stage('Build') {
                      steps {
                          script {
                              docker.image('<image>').inside('-e MY_VAR=value2') {
                                  sh 'env | grep MY_VAR'
                              }
                          }
                      }
                  }
              }
          }
          {code}

          {noformat}
          # Observe the result. It prints MY_VAR=value1 instead of MY_VAR=value2
          14:55:39 [Pipeline] withDockerContainer
          14:55:39 jknn2t-mdjrvo does not seem to be running inside a container
          14:55:39 $ docker run -t -d -u 78572:20 -e MY_VAR=value2 -w /var/appl/jenkins/workspace/sle/mrichar2_var_ordering -v /var/appl/jenkins/workspace/sle/mrichar2_var_ordering:/var/appl/jenkins/workspace/sle/mrichar2_var_ordering:rw,z -v /var/appl/jenkins/workspace/sle/mrichar2_var_ordering@tmp:/var/appl/jenkins/workspace/sle/mrichar2_var_ordering@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** <image> cat
          14:55:39 $ docker top 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659 -eo pid,comm
          14:55:39 [Pipeline] {
          14:55:39 [Pipeline] sh
          14:55:40 + env
          14:55:40 + grep MY_VAR
          14:55:40 MY_VAR=value1
          14:55:40 [Pipeline] }
          14:55:40 $ docker stop --time=1 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659
          14:55:41 $ docker rm -f 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659
          14:55:41 [Pipeline] // withDockerContainer
          14:55:41 [Pipeline] }
          14:55:41 [Pipeline] // script
          14:55:41 [Pipeline] }
          14:55:41 [Pipeline] // stage
          14:55:41 [Pipeline] }
          14:55:41 [Pipeline] // node
          14:55:41 [Pipeline] End of Pipeline
          {noformat}

          New: If a global environment variable is defined it is not possible to override it with arguments passed in to the docker.image(...).inside(...) step. It appears to be because environment variables from the process added to the docker launch arguments after any user specified arguments [here|https://github.com/jenkinsci/docker-workflow-plugin/blob/master/src/main/java/org/jenkinsci/plugins/docker/workflow/client/DockerClient.java#L135].

          The solution could simply be to put user args last assuming it's okay / secure for users to have the ability to override any of the automatically injected arguments.

          To reproduce:
          # Create a global environment variable MY_VAR=value1
          # Create a pipeline job with the following script that sets MY_VAR=value2 as an image arguments
          #-
          {code:java}
          pipeline {
              agent {
                  label "docker"
              }

              stages {
                  stage('Build') {
                      steps {
                          script {
                              docker.image('<image>').inside('-e MY_VAR=value2') {
                                  sh 'env | grep MY_VAR'
                              }
                          }
                      }
                  }
              }
          }
          {code}

          # Observe the result. It prints MY_VAR=value1 instead of MY_VAR=value2
          {noformat}
          14:55:39 [Pipeline] withDockerContainer
          14:55:39 jknn2t-mdjrvo does not seem to be running inside a container
          14:55:39 $ docker run -t -d -u 78572:20 -e MY_VAR=value2 -w /var/appl/jenkins/workspace/sle/mrichar2_var_ordering -v /var/appl/jenkins/workspace/sle/mrichar2_var_ordering:/var/appl/jenkins/workspace/sle/mrichar2_var_ordering:rw,z -v /var/appl/jenkins/workspace/sle/mrichar2_var_ordering@tmp:/var/appl/jenkins/workspace/sle/mrichar2_var_ordering@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** <image> cat
          14:55:39 $ docker top 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659 -eo pid,comm
          14:55:39 [Pipeline] {
          14:55:39 [Pipeline] sh
          14:55:40 + env
          14:55:40 + grep MY_VAR
          14:55:40 MY_VAR=value1
          14:55:40 [Pipeline] }
          14:55:40 $ docker stop --time=1 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659
          14:55:41 $ docker rm -f 8a93013c14625256f17f5fc2d71132333ac6aa35962da9540b1a8171a934c659
          14:55:41 [Pipeline] // withDockerContainer
          14:55:41 [Pipeline] }
          14:55:41 [Pipeline] // script
          14:55:41 [Pipeline] }
          14:55:41 [Pipeline] // stage
          14:55:41 [Pipeline] }
          14:55:41 [Pipeline] // node
          14:55:41 [Pipeline] End of Pipeline
          {noformat}

            Unassigned Unassigned
            mrichar2 Mark R
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated: