当前位置: 首页 > 知识库问答 >
问题:

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

巩枫
2023-03-14

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

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

我们有一个约束列表:

    null
  • 在docker容器中使用SSH密钥(SSH密钥在构建时传递-我们需要运行时)
  • 用dockerfile克隆私有git repo(相同问题)
  • 使用Docker Compose(以身份运行)将主机的SSH密钥注入Docker计算机

共有1个答案

闾丘朗
2023-03-14

您可以使用以下内容:

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会话,您的映像可能不需要它
Cloning into 'myrepo'...
No user exists for uid 1000
fatal: Could not read from remote repository.
git-user:x:1000:1000:Git User:/tmp:/bin/bash
  • git-user存在UID 1000和GID 1000
  • 它的主目录是/tmp(它是可选的,但此目录是可写的,避免Git Clone的警告)

通过设置/tmp(或在映像构建期间创建的另一个目录),我们可以确保git-user有一个可写的主目录,这将防止git clone发出警告,说它无法创建.ssh目录

但是,如果您打算使用容器运行不同的任务,这可能会产生其他副作用。

git_ssh_command='ssh-i/path/to/.ssh/id_rsa'将确保git clone正在使用我们的密钥,但这也可以使用ssh-agent来完成-请参阅https://serverfault.com/questions/447028/non-interactive-git-clone-ssh-fingert-prompt

在示例中,我使用-o“strithostkeychecking=no”但它可能不安全,另一个解决方案是在带有git repo服务器主机密钥的容器中挂载一个已知的主机文件,并使用-o“userknownhostsfile=/path/to/knownhostfile”

 类似资料:
  • 本文向大家介绍Git 克隆SVN存储库,包括了Git 克隆SVN存储库的使用技巧和注意事项,需要的朋友参考一下 示例 您需要使用以下命令创建存储库的新本地副本 git svn clone SVN_REPO_ROOT_URL [DEST_FOLDER_PATH] -T TRUNK_REPO_PATH -t TAGS_REPO_PATH -b BRANCHES_REPO_PATH 如果您的SVN储存库

  • 我有一个Dockerfile文件,试图将一个web应用程序打包并部署到一个容器中。在Docker映像构建期间,app的代码从git存储库中获取。以下是Dockerfile快照: 我希望 docker 不要缓存 RUN git 克隆的步骤 -- 以便存储库上正在进行的更新可以反映在 Docker 映像构建中。有可能做到这一点吗?

  • 问题内容: 我真的很坚持这一点。我在哈德森(Hudson)创建了一个工作,并以与其他工作相同的方式进行了配置。我的项目和构建交付物存在于Git中。但是每次我尝试构建它时,都会出现以下错误: 在其他线程中,有人建议通过以jenkins用户身份登录来创建不同的私钥-公钥对,但我什至不知道如何在终端中执行此操作。我的意思是我知道如何使用“ sudo”命令以不同的用户身份登录,但我不认为有人建议使用sud

  • 到现在为止,读者已经零略到Git的灵活性以及健壮性。Git可以通过重置随意撤销提交,可以通过变基操作更改历史,可以随意重组提交,还可以通过reflog的记录纠正错误的操作。但是再健壮的版本库设计,也抵挡不了存储介质的崩溃。还有一点就是不要忘了Git版本库是躲在工作区根目录下的.git目录中,如果忘了这一点直接删除工作区,就会把版本库也同时删掉,悲剧就此发生。 “不要把鸡蛋装在一个篮子里”,是颠扑不

  • 问题内容: 我已经通过Windows 2008 32位上的Git / SSH在Jenkins中成功克隆了Git存储库。当我尝试在64位Windows 2008上执行相同操作时, 控制台输出 页面卡在此处: 当我停止构建时(在卡住了几分钟之后),我得到了其余的错误消息: 我可以通过两台机器上的Jenkins 通过Git只读URL克隆存储库 我可以从两台计算机上的命令行通过Git / SSH URL进

  • 我正在尝试连接到我的VPS上托管的gerrit。我正在使用Git Bash for windows。我在GitBash中使用SSH-keygen生成了SSH密钥,并在gerrit服务器上添加了密钥。当我运行ssh时-p 29418 但当我通过运行以下命令克隆存储库时 我在Git Bash终端中看到以下错误 我无法理解正在发生什么以及如何在我的机器中成功克隆我的项目。有谁能在这件事上帮助我吗? 更新