2014-12-05 53 views
2

我正在部署一个nginx实例。 dockerfile以及nginx配置数据和Web应用程序都在我的git存储库中。对我来说,这似乎是有道理的,这是一个git仓库:应用程序以及如何部署它。在Dockerfile我想说的(这是简化了一点,但问题是,我不能)将git存储库添加到docker镜像(工作流最佳实践)

COPY web-app /serving 
COPY docker/site-conf /etc/nginx/sites-enabled/ 

在那里我有这样的目录结构:

my-git-root 
    web-app 
     ... 
    docker 
     Dockerfile 
     build.sh 
     site-conf 

的问题,至少在部分,码头的上下文是my-git-root/docker /。

本着不可变服务的精神,我希望容器拥有git存储库的快照,而不是容器中的apt-get install'ing git并将数据拉出。但是我没有看到如何做这个工作,除非我把Docker的东西分离出来放到一个单独的git仓库中,然后在每一个版本上克隆web应用程序 - 我宁愿不让任何人试图在生活中勉强接受容器。

关于更理智的工作流程的建议?

回答

2

“在永恒不变的服务精神,...把数据”

如果你在你的dockerfile这样做,然后这发生在容器的创建时间,而不是运行时。因此,每个版本的容器都将具有特定版本的数据。如果您使用与您的Web应用程序回购的版本标签相匹配的标签来部署容器,那么将很清楚您在每个容器中运行的是哪个版本的Web应用程序。

“apt-get的install'ing混帐”

您可以使用GitHub的HTTP接口,在一个特定的标签,下载web应用程序的压缩包或提交哈希,因此不能拉动最新的和可能破碎的webapp。

在Dockerfile我想说...

如果移动dockerfile你可以使用copy命令的混帐回购协议的根源,你表现出作为整个代码变得的一部分码头上下文。这在码头回购中是很常见的做法。

我建议在其自己的Git回购的通用nginx的容器,它不会复制Web的应用程序/在构建时服务“上更理智的工作流程..建议”。在运行代码的主机上以卷的形式安装web-app。然后,您可以使用任何方法(docker外部)将您当前的代码状态置于服务器上。您的码头集装箱在任何时候都可以独立于代码的状态。当你需要修复你的nginx设置而不必寻找容器中的代码时,这将有所帮助。

有时您无法访问主机fs,即如果您在Amazon Elastic Beanstalk上运行。在那种情况下,我会建议我有上面提到的nginx容器的通用容器。然后在您的web应用程序项目的根目录中使用with myNginx:version6并在正确的位置复制web-app文件夹中的dockerfile。该容器可以与myApp:SomeVersion一起部署。通过这种方式,您可以使用任何与部署有关的问题以及使用代码进行版本控制的myApp容器来提供一个众所周知的Nginx容器。

有关于这些方法的讨论here其中所罗门海克斯解决这个问题。

+0

是“将dockerfile移动到git repo的根目录”; “将web应用程序安装为音量”为-1。这不是“不变的服务精神”。 – Bryan 2014-12-05 17:40:40