Clone private git repo with dockerfile Clone private git repo with dockerfile git git

Clone private git repo with dockerfile


My key was password protected which was causing the problem, a working file is now listed below (for help of future googlers)

FROM ubuntuMAINTAINER Luke Crooks "luke@pumalo.org"# Update aptitude with new repoRUN apt-get update# Install software RUN apt-get install -y git# Make ssh dirRUN mkdir /root/.ssh/# Copy over private key, and set permissions# Warning! Anyone who gets their hands on this image will be able# to retrieve this private key file from the corresponding image layerADD id_rsa /root/.ssh/id_rsa# Create known_hostsRUN touch /root/.ssh/known_hosts# Add bitbuckets keyRUN ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts# Clone the conf files into the docker containerRUN git clone git@bitbucket.org:User/repo.git


You should create new SSH key set for that Docker image, as you probably don't want to embed there your own private key. To make it work, you'll have to add that key to deployment keys in your git repository. Here's complete recipe:

  1. Generate ssh keys with ssh-keygen -q -t rsa -N '' -f repo-key which will give you repo-key and repo-key.pub files.

  2. Add repo-key.pub to your repository deployment keys.
    On GitHub, go to [your repository] -> Settings -> Deploy keys

  3. Add something like this to your Dockerfile:

    ADD repo-key /RUN \  chmod 600 /repo-key && \    echo "IdentityFile /repo-key" >> /etc/ssh/ssh_config && \    echo -e "StrictHostKeyChecking no" >> /etc/ssh/ssh_config && \    // your git clone commands here...

Note that above switches off StrictHostKeyChecking, so you don't need .ssh/known_hosts. Although I probably like more the solution with ssh-keyscan in one of the answers above.


There's no need to fiddle around with ssh configurations. Use a configuration file (not a Dockerfile) that contains environment variables, and have a shell script update your docker file at runtime. You keep tokens out of your Dockerfiles and you can clone over https (no need to generate or pass around ssh keys).

Go to Settings > Personal Access Tokens

  • Generate a personal access token with repo scope enabled.
  • Clone like this: git clone https://MY_TOKEN@github.com/user-or-org/repo

Some commenters have noted that if you use a shared Dockerfile, this could expose your access key to other people on your project. While this may or may not be a concern for your specific use case, here are some ways you can deal with that:

  • Use a shell script to accept arguments which could contain your key as a variable. Replace a variable in your Dockerfile with sed or similar, i.e. calling the script with sh rundocker.sh MYTOKEN=foo which would replace on https://{{MY_TOKEN}}@github.com/user-or-org/repo. Note that you could also use a configuration file (in .yml or whatever format you want) to do the same thing but with environment variables.
  • Create a github user (and generate an access token for) for that project only