在Docker容器中克隆私人git回购

我有一个项目(用ruby书写),我想运行在一个docker图像。 项目的源代码存储在一个私人的git仓库中,镜像是通过Dockerfile创build的。 该项目是巨大的,所以git克隆需要相当长的时间。

问题是,我不知道如何(何时/何地)正确地克隆docker图像的git仓库。 我可以将git仓库克隆到临时目录,并通过Dockerfile中的COPY命令复制源代码。 我不喜欢这样做,因为我将不得不维持临时目录中的第二个克隆。

或者,我可以在Docker镜像中克隆回购。 问题是我的ssh键,我不能合理地保持在图像中。 我可以只添加“我自己”的密钥到允许访问所有内容的git服务器。

所以,我创build了这样一个脚本:

UUID=`uuid` docker run \ -v $HOME/.ssh:/home/user/.ssh:ro\ --name=$UUID \ -it $1 /scripts/git-clone-update.sh docker commit $UUID $1 docker rm $UUI 

git-clone-update.sh克隆项目,如果它不存在或只是更新,如果它。 这些键被安装到.ssh。 它工作很好。 我可以通过调用传递图像名称的脚本作为参数来更新图像中的代码。 唯一的问题是Config.Cmd总是变成/scripts/git-clone-update.sh。

任何想法如何保持原来的Config.Cmd? 在docker图像中克隆私人ropo的最佳做法是什么?

谢谢

正如你已经发现的,将你私人的SSH密钥保存在一个docker镜像中对于安全来说并不是很好。 我已经看到了两种方法:

  1. 创build一个新的只读帐户,并将其密钥保存在泊坞窗图像中。 你可以把更多的限制放在这个帐户上,安全性更好,但是你仍然在真正的源代码上打包一个秘密。

    此外,这并不能解决你的脚本问题,我承认没有线索如何解决。

  2. 托pipe你的代码已经复制的整个,打包的docker文件。这是Mark O'Conner在他的评论中提到的方法。 发布的工作stream程将是:

    • 将代码复制到Docker容器中。
    • 更新泊坞窗图像。
    • 将新镜像上传到您的docker仓库(例如hub.docker.com或Amazon Web Services Elastic Beanstalk)。
    • 更新或启动新的容器图像的新实例。

对于开发,即每天使用第二种方法,您可以有一个启动脚本,将代码复制到Docker容器中,并根据需要运行或重新启动容器或服务器。 或者你可以有一个单独的开发docker镜像,你可以将源码控制目录安装成一个单独的卷。