Search code examples
dockerjenkinsjenkins-pipelinedevopscredentials

How to pass jenkins credentials into docker build command?


My Jenkins pipeline code successfully checks out my private git repo from bitbucket using

checkout([$class: 'GitSCM',
            userRemoteConfigs: [[credentialsId: 'cicd-user', url:'ssh://[email protected]:7999/A/software.git']]

in same software.git I have a Dockerfile that I want to use to build various build targets present in software.git on Kubernetes and I am trying the below to pass jenkins credentials into a docker container that I want to build and run.

So in the same jenkins pipeline when I checked out software.git (above code), I try to do the following to get the docker container built

  withCredentials([sshUserPrivateKey(credentialsId: 'cicd-user', keyFileVariable: 'FILE')]) { 
           sh "cd ${WORKSPACE} && docker build -t ${some-name} --build-arg USERNAME=cicd-user --build-arg  PRIV_KEY_FILE=$FILE --network=host -f software/tools/jenkins/${some-name}/Dockerfile ."
        }

in Dockerfile I do

RUN echo "$PRIV_KEY_FILE" > /home/"$USERNAME"/.ssh/id_rsa && \
 chmod 700 /home/"$USERNAME"/.ssh/id_rsa 

RUN echo "Host bitbucket.myorg.co\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config

But still from my Docker container I am not able to successfully checkout my private repo(s). What am I missing ? Any comments, suggestions ? Thanks.


Solution

  • Please read about Groovy String Interpolation.

    In your expression

    sh "cd ${WORKSPACE} && docker build -t ${some-name} \
    --build-arg USERNAME=cicd-user \
    --build-arg  PRIV_KEY_FILE=$FILE --network=host \
    -f software/tools/jenkins/${some-name}/Dockerfile ."
    

    you use double quotes so Groovy interpolates all the variables in the string. This includes $FILE so Groovy replaces that with the value of Groovy variable named FILE. You don't have any Groovy variable with that name (but rather bash variable which is different from Groovy) so this gets replaced with an empty string.

    To prevent interpolating that particular variable, you need to hint Groovy not to interpolate this particular one, by escaping this $ with \:

    sh "cd ${WORKSPACE} && docker build -t ${some-name}\
     --build-arg USERNAME=cicd-user \
     --build-arg  PRIV_KEY_FILE=\$FILE --network=host \
     -f software/tools/jenkins/${some-name}/Dockerfile ."