假设我有一个容器,它配备齐全,可以为带有 Passenger 和 Apache 的 Rails 应用程序提供服务,并且我有一个虚拟主机,可以在我的容器中路由到 /var/www/app/public。既然容器应该有点像一个进程,那么当我的 Rails 代码发生变化时我会怎么做?如果app
是用 Git 克隆的,并且 repo 中有待处理的更改,pull
这些更改中的容器如何自动进行?
3 回答
您可以选择如何构建容器,具体取决于您的部署理念:
最小:您在 Docker 文件(运行命令)中安装所有 rails pre-reqs,但让 ENTRYPOINT 类似于“
git pull && bundle install --deployment && rails run
”。在容器启动时,它将获取您的最新代码。快照:同上,但 ENTRYPOINT也是一个 RUN 命令。这样,容器就预先安装了代码快照,但在容器启动时仍会更新。有时这可以加快启动时间(即如果大多数 gem 已经安装)。
Container as Deployment:同上,但
rails run
只将 ENTRYPOINT 更改为“”。这样,您的容器就是您的代码。每次更换导轨时都必须制作新容器(自动化!)。优点是您的容器根本不需要联系您的代码仓库。缺点是您必须始终记住最新的容器是什么。(标签可以提供帮助)而现在,Docker 没有关于清理旧容器的好故事。
在这种情况下,听起来您已经构建了一个映像,并且现在正在容器中运行该映像。
使用您正在运行的容器所源自的映像,您可以添加另一个构建步骤以 git pull 您最新的代码。我认为这是一个增量更新,因为您建立在预先存在的图像上。我建议适当地标记并推送到您的(假设您使用私有索引)。新图像将可以运行。
根据需要,您还可以重建软件的基本映像。我假设您使用Dockerfile来构建您的原始图像,其中包括您的软件的 git checkout。然后,您可以标记并推送到您的索引以供适当使用。
在 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
在主机的源目录中,它就会更新容器的源。