用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存储库中的部署密钥。 这是完整的食谱:
-
使用
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文件。 -
将repo-key.pub添加到您的存储库部署密钥。
在GitHub上,转到[您的存储库] – >设置 – >部署密钥 -
把这样的东西添加到你的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/repo
:git 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
。