Docker rails应用程序和git

比方说,我有一个容器,完全具备Passenger和Apache服务Rails应用程序,我有一个虚拟主机,路由到/ var / www / app / public在我的容器。 由于一个容器应该像一个过程,我的Rails代码改变时我该怎么办? 如果app被克隆了Git,并且在回购中有待处理的更改,那么容器如何自动pull这些更改?

根据您的部署理念,您可以select如何构build容器。

  • 最小化:在Docker文件(RUN命令)中安装所有rails pre-reqs,但将ENTRYPOINT设置为“ git pull && bundle install --deployment && rails run ”。 在容器启动时,它会得到你最新的代码。

  • 快照:和上面一样,但是ENTRYPOINT 也是一个RUN命令。 通过这种方式,容器具有预先安装的代码快照,但在启动容器时它仍会更新。 有时这可以加快启动时间(即如果大部分gem已经安装)。

  • 作为部署的容器:与上述相同,但只将ENTRYPOINT更改为“ rails run ”。 这样,你的容器就是你的代码。 每次更换导轨(自动化!)时,都必须制作新的容器。 好处是您的容器根本不需要联系您的代码回购。 缺点是你必须时刻记住最新的容器是什么。 (标签可以帮助)现在,Docker在清理旧容器方面没有一个好的故事。

在这种情况下,听起来像你已经build立了一个图像 ,现在正在一个容器中运行这个图像。

使用正在运行的容器来源的图像,您可以添加另一个构build步骤,以git拉你的最新的代码。 我认为这是一个增量更新作为你的build立在一个预先存在的形象。 我会推荐标签并推荐给你(假设你使用私人索引)。 新的图像可以运行。

根据需要,您也可以重build软件的基本映像。 我假设您使用Dockerfile来构build您的原始图像,其中包括您的软件的git结帐。 然后,您可以标记并推送到您的索引适当使用。

在docker v0.8中,可以在一个正在运行的容器中启动一个新的命令,这样你就可以做你想做的事情。

同时,一个解决scheme将包括使用卷。

选项1:Dockerpipe理卷FROM ubuntu ... VOLUME ["/var/www/app/public"] ADD host/src/path /var/www/app/public CMD start rails

启动并运行你的容器,然后当你需要git拉,你可以简单地: $ docker ps # -> retrieve the id of the running container $ docker run -volumes-from <container id> <your image with git installed> sh -c 'cd/var/www/app/public && git pull -u'

这将导致你的第一个运行的容器有更新的来源。

选项2:主机卷

你可以启动你的容器: $ docker run -v `pwd`/srcs:/var/www/app/public <yourimage>

然后只需将git pull入主机的源代码目录,它将更新容器的源代码。