用dockerfile克隆私人git回购

我已经从似乎是各种各样的工作dockerfiles复制此代码,这里是我的:

FROM ubuntu MAINTAINER Luke Crooks "luke@pumalo.org" # Update aptitude with new repo RUN apt-get update # Install software RUN apt-get install -y git python-virtualenv # Make ssh dir RUN mkdir /root/.ssh/ # Copy over private key, and set permissions ADD id_rsa /root/.ssh/id_rsa RUN chmod 700 /root/.ssh/id_rsa RUN chown -R root:root /root/.ssh # Create known_hosts RUN touch /root/.ssh/known_hosts # Remove host checking RUN echo "Host bitbucket.org\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config # Clone the conf files into the docker container RUN git clone git@bitbucket.org:Pumalo/docker-conf.git /home/docker-conf 

这给了我错误

 Step 10 : RUN git clone git@bitbucket.org:Pumalo/docker-conf.git /home/docker-conf ---> Running in 0d244d812a54 Cloning into '/home/docker-conf'... Warning: Permanently added 'bitbucket.org,131.103.20.167' (RSA) to the list of known hosts. Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 2014/04/30 16:07:28 The command [/bin/sh -c git clone git@bitbucket.org:Pumalo/docker-conf.git /home/docker-conf] returned a non-zero code: 128 

这是我第一次使用dockerfiles,但是从我读过的(并从工作configuration中获取),我看不出为什么这不起作用。

我的id_rsa和我的dockerfile是在同一个文件夹,是我的本地密钥的副本,可以克隆这个回购没有问题。

编辑:

在我的dockerfile中,我可以添加:

 RUN cat /root/.ssh/id_rsa 

它打印出正确的密钥,所以我知道它被正确复制。

我也试图做noahbuild议和跑:

 RUN echo "Host bitbucket.org\n\tIdentityFile /root/.ssh/id_rsa\n\tStrictHostKeyChecking no" >> /etc/ssh/ssh_config 

这可悲也不起作用。

我的密码是密码保护,这是造成这个问题,一个工作文件现在列在下面(为未来谷歌的帮助)

 FROM ubuntu MAINTAINER Luke Crooks "luke@pumalo.org" # Update aptitude with new repo RUN apt-get update # Install software RUN apt-get install -y git # Make ssh dir RUN mkdir /root/.ssh/ # Copy over private key, and set permissions ADD id_rsa /root/.ssh/id_rsa # Create known_hosts RUN touch /root/.ssh/known_hosts # Add bitbuckets key RUN ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts # Clone the conf files into the docker container RUN git clone git@bitbucket.org:User/repo.git 

您应该为该Docker映像创build新的SSH密钥集,因为您可能不想在其中embedded您自己的私钥。 为了使其工作,你必须将该密钥添加到git存储库中的部署密钥。 这是完整的食谱:

  1. 使用ssh-keygen -q -t rsa -N '' -f repo-key生成ssh密钥ssh-keygen -q -t rsa -N '' -f repo-key -N'- ssh-keygen -q -t rsa -N '' -f repo-key会给你repo-key和repo-key.pub文件。

  2. 将repo-key.pub添加到您的存储库部署密钥。
    在GitHub上,转到[您的存储库] – >设置 – >部署密钥

  3. 把这样的东西添加到你的Dockerfile中:

     ADD回购密钥/
    跑 \
       chmod 600 / repo-key && \  
       echo“IdentityFile / repo-key”>> / etc / ssh / ssh_config && \  
       echo -e“StrictHostKeyChecking no”>> / etc / ssh / ssh_config && \  
       //你的git clone命令在这里...
    

注意上面的StrictHostKeyCheckingclosures,所以你不需要.ssh / known_hosts。 虽然我可能更喜欢在上面的答案之一ssh-keyscan的解决scheme。

有没有必要摆弄sshconfiguration。 使用包含环境variables的configuration文件(不是Dockerfile),并在运行时使用shell脚本更新docker文件。 您可以将Docker文件放在Docker文件中,并且可以通过https进行克隆(无需生成或传递ssh密钥)。

转到设置>个人访问令牌

  • 生成启用了repo作用域的个人访问令牌。
  • 像这样git clone https://MY_TOKEN@github.com/user-or-org/repogit clone https://MY_TOKEN@github.com/user-or-org/repo

一些评论者指出,如果您使用共享的Dockerfile,这可能会将您的访问密钥暴露给项目中的其他人。 虽然这可能会或可能不会成为您特定用例的关注点,但您可以通过以下方法处理这些问题:

  • 使用shell脚本接受可能包含您的密钥作为variables的参数。 把你的Dockerfile中的一个variables换成sed或类似的文件,即用sh rundocker.sh MYTOKEN=foo调用脚本sh rundocker.sh MYTOKEN=foo ,它将replacehttps://{{MY_TOKEN}}@github.com/user-or-org/repo 。 请注意,您也可以使用configuration文件(以.yml或任何您想要的格式)来执行相同的操作,但使用环境variables。
  • 只为该项目创build一个github用户(并为其生成一个访问令牌)

对于bitbucket存储库,生成应用程序密码(访问pipe理 – >应用程序密码)与读取存取回购和项目。 那么你应该使用的命令是:

git clone https://username:generated_password@bitbucket.org/reponame/projectname.git