克隆docker容器

时间:2015-10-27 16:49:19

标签: git docker

我有一个项目(用ruby编写),我希望在docker镜像中运行。项目源代码存储在私有git仓库中,映像通常由Dockerfile创建。该项目非常庞大,因此git clone需要相对较长的时间。

问题在于,我不确定如何(何时/何地)将git repo正确克隆到docker镜像。我可以将git存储库克隆到临时目录,并通过Dockerfile中的COPY命令复制源代码。我不喜欢这样做,因为我必须在temp目录中维护第二个克隆。

或者,我可以在docker镜像中克隆repo。问题是我的ssh-key,我无法合理地保留在图像中。我只能向git服务器添加“我自己的”密钥,允许访问所有内容。

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

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吗?将私人ropo克隆到码头图像中的最佳做法是什么?

THX

1 个答案:

答案 0 :(得分:2)

正如您所发现的那样,将私有ssh密钥保存在docker镜像中对于安全性并不是很好。我已经看到了两种方法:

  1. 创建一个新的只读帐户,并将其密钥保存在docker镜像中。您可以对此帐户施加的限制越多,安全性就越高,但您仍然会在实际源代码之上打包秘密。

    此外,这并不能解决您的脚本问题,我不知道如何解决这个问题。

  2. 托管整个已打包的docker文件,并将代码复制到其中。这是Mark O' Conner在评论中提到的方法。发布的工作流程为:

    • 将代码复制到docker容器中。
    • 更新泊坞窗图片。
    • 将新映像上传到docker存储库(例如hub.docker.com或Amazon Web Services Elastic Beanstalk)。
    • 更新或启动新容器图像的新实例。
  3. 对于开发,即每天使用第二种方法,您可以使用启动脚本将代码复制到docker容器中,并根据需要运行或重新启动容器内的容器或服务器。或者,您可以使用单独的开发docker映像,将其配置为将源控制目录作为单独的卷安装。