繁体   English   中英

如何从Docker容器克隆Git存储库

[英]How to clone a Git repository from a Docker container

我们有一个工具需要克隆几个Git存储库来聚合文档数据。 我们希望将该工具放在Docker容器中,以便在本地和Jenkins中轻松运行它,并实现可重复性。

Git存储库托管在需要使用SSH密钥进行身份验证的私有服务器上。 因此,Docker容器必须以某种方式访问​​运行容器的用户的SSH密钥。

我们有一个约束列表:

  1. 我们希望嵌入泊坞窗图像中的SSH密钥
  2. 我们希望用户构建Docker镜像。 我们认为Dockerfile不支持再现性, Dockerfile生成的Docker镜像支持重现性
  3. 我们希望容器以root用户身份运行
  4. 我们想要使用运行容器的主机用户的SSH密钥
  5. 参数可以提供给启动容器的命令( -v-u ,...)

问题:如果有可能,我们如何才能实现这一目标?

有关:

您可以使用以下内容:

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的容器(例如alpinedebian )时, 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
  • 它的HOME目录是/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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM