[英]How to clone a Git repository from a Docker container
我们有一个工具需要克隆几个Git存储库来聚合文档数据。 我们希望将该工具放在Docker容器中,以便在本地和Jenkins中轻松运行它,并实现可重复性。
Git存储库托管在需要使用SSH密钥进行身份验证的私有服务器上。 因此,Docker容器必须以某种方式访问运行容器的用户的SSH密钥。
我们有一个约束列表:
Dockerfile
不支持再现性, Dockerfile
生成的Docker镜像支持重现性 root
用户身份运行 -v
, -u
,...) 问题:如果有可能,我们如何才能实现这一目标?
有关:
root
身份运行) 您可以使用以下内容:
echo "git-user:x:$(id -u):$(id -g):Git User:/tmp:/bin/bash" > /tmp/fake_passwd # See below why to use this
docker run \
-u $(id -u):$(id -g) \
-w /tmp \
-v $HOME/.ssh:/path/to/.ssh \
-v /tmp/fake_passwd:/etc/passwd \
--entrypoint sh \
-it \
alpine/git
# commands in the container:
$ export GIT_SSH_COMMAND='ssh -i /path/to/.ssh/id_rsa -o "StrictHostKeyChecking=no"'
$ git clone [path to git repo]
这将确保容器以与主机用户相同的UID / GID运行,从而能够在不更改其权限或使用root权限的情况下读取密钥。 详情如下:
-u $(id -u):$(id -g)
设置容器用户以匹配主机用户 -w /tmp
确保我们在可以写入的目录中工作(我们也可以安装一个我们有读/写权限的卷或用这样的目录构建映像) -v $HOME/.ssh:/path/to/.ssh
从主机安装本地用户SSH密钥 --entrypoint sh
和-it
是特定于alpine/git
有一个交互式shell会话,您可能无法与你的形象需要它 /etc/passwd
文件? 当您运行具有未知UID / GID(在/etc/passwd
不存在的容器)的基于Linux的容器(例如alpine
或debian
)时, git clone
命令可能会导致错误消息,例如:
Cloning into 'myrepo'...
No user exists for uid 1000
fatal: Could not read from remote repository.
通过安装这个“伪”passwd文件,我们确保操作系统将识别运行容器的用户并允许我们的git clone命令工作。 我们的密码文件如下:
git-user:x:1000:1000:Git User:/tmp:/bin/bash
这大致意味着:
git-user
存在UID 1000和GID 1000 /tmp
(它是可选的但是这个目录是可写的并且避免来自git clone
一些警告) 通过设置/tmp
(或可能在映像构建期间创建的另一个目录),我们确保为git-user
提供可写的HOME目录,这将阻止来自git clone
的警告,说它无法创建.ssh
目录
但是,如果您打算对容器运行不同的任务,则可能会产生其他副作用。
GIT_SSH_COMMAND
? GIT_SSH_COMMAND='ssh -i /path/to/.ssh/id_rsa'
将确保git clone
使用我们的密钥,但这也可以使用ssh-agent完成 - 请参阅https://serverfault.com/questions/447028/非交互式的git克隆-SSH指纹提示
在示例中我使用-o "StrictHostKeyChecking=no"
但它可能不安全 ,另一种解决方案是使用git repo服务器主机密钥在容器中挂载已知主机文件并使用-o "UserKnownHostsFile=/path/to/KnownHostFile"
克隆主机上的存储库并将目录安装在docker镜像中是否正常?
例如:
git clone github:repo1
git clone github:repo2
...
docker run -v repo1:/path/to/repo1 -v repo2:/path/to/repo2 ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.