4

假设我有一个容器,它配备齐全,可以为带有 Passenger 和 Apache 的 Rails 应用程序提供服务,并且我有一个虚拟主机,可以在我的容器中路由到 /var/www/app/public。既然容器应该有点像一个进程,那么当我的 Rails 代码发生变化时我会怎么做?如果app是用 Git 克隆的,并且 repo 中有待处理的更改,pull这些更改中的容器如何自动进行?

4

3 回答 3

8

您可以选择如何构建容器,具体取决于您的部署理念:

  • 最小:您在 Docker 文件(运行命令)中安装所有 rails pre-reqs,但让 ENTRYPOINT 类似于“ git pull && bundle install --deployment && rails run”。在容器启动时,它将获取您的最新代码。

  • 快照:同上,但 ENTRYPOINT也是一个 RUN 命令。这样,容器就预先安装了代码快照,但在容器启动时仍会更新。有时这可以加快启动时间(即如果大多数 gem 已经安装)。

  • Container as Deployment:同上,但rails run只将 ENTRYPOINT 更改为“”。这样,您的容器就是您的代码。每次更换导轨时都必须制作新容器(自动化!)。优点是您的容器根本不需要联系您的代码仓库。缺点是您必须始终记住最新的容器是什么。(标签可以提供帮助)而现在,Docker 没有关于清理旧容器的好故事。

于 2013-09-15T19:00:04.817 回答
0

在这种情况下,听起来您已经构建了一个映像,并且现在正在容器中运行该映像。

使用您正在运行的容器所源自的映像,您可以添加另一个构建步骤以 git pull 您最新的代码。我认为这是一个增量更新,因为您建立在预先存在的图像上。我建议适当地标记并推送到您的(假设您使用私有索引)。新图像将可以运行。

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

于 2013-09-15T11:07:15.717 回答
0

在 docker v0.8 中,可以在正在运行的容器中启动新命令,因此您将能够做您想做的事。

同时,一种解决方案是使用卷。

选项 1:Docker 托管卷

FROM ubuntu
...
VOLUME ["/var/www/app/public"]
ADD host/src/path /var/www/app/public
CMD start rails

启动并运行您的容器,然后当您需要 git pull 时,您可以简单地:

$ 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在主机的源目录中,它就会更新容器的源。

于 2013-09-17T21:33:15.660 回答