将git存储库添加到docker镜像(工作流最佳实践)

时间:2014-12-05 15:05:02

标签: git nginx docker

我正在部署一个nginx实例。 dockerfile以及nginx配置数据和web应用程序都存在于我的git存储库中。对我来说似乎有意义的是,这是一个git存储库:应用程序以及如何部署它。在Dockerfile中我想说(这有点简化,但关键是我可以')

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

我有这个目录结构:

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

至少在某种程度上,问题是docker的上下文是my-git-root / docker /。

本着不可变服务的精神,我希望容器能够拥有git存储库的快照,而不是apt-get install容器中的git并提取数据。但我不知道如何使这个工作,除非我将docker的东西分离到一个单独的git存储库,然后git克隆每个构建的web应用程序 - 我宁愿不让任何人甚至被诱惑git拉进一个活的容器。

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

1 个答案:

答案 0 :(得分:3)

  

"本着不可改变的服务精神,......拉动数据"

如果你在dockerfile中这样做,那么这发生在容器创建时而不是运行时。因此,容器的每个版本都将具有特定版本的数据。如果使用与web-app repo的发行版标记匹配的标记部署容器,则可以清楚地了解每个容器中运行的Web应用程序版本。

  

" apt-get install' git"

您可以使用github的http接口在特定标签下下载webapp的tarball或提交哈希,因此不会引入最新且可能已损坏的webapp。

  

在Dockerfile中我想说...

如果将dockerfile移动到git repo的根目录,则可以使用copy命令,因为整个代码成为docker上下文的一部分。这是docker repos中的常见做法。

  

"关于更合理的工作流程的建议。"

我建议在自己的git repo中使用一个通用的nginx容器,它不会在构建时复制web-app / serve。从运行代码的主机将Web应用程序挂载为卷。然后,您可以使用任何方法(docker外部)将当前代码状态放到服务器上。您的docker容器可以在任何给定时间独立于代码的状态。这将有助于您需要修复nginx设置而无需查找容器中的代码。

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

有关这些方法的讨论here,其中Solomon Hykes解决了这个问题。