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

将git存储库添加到docker映像(工作流最佳实践),git,nginx,docker,Git,Nginx,Docker,我正在部署一个nginx实例。dockerfile以及nginx配置数据和web应用程序都位于我的git存储库中。对我来说,这似乎是一个git存储库:应用程序和如何部署它。在Dockerfile中我想说(这有点简化,但重点是我不能) 其中我有这个目录结构: my-git-root web-app ... docker Dockerfile build.sh site-conf 问题是,至少在某种程度上,docker的

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

其中我有这个目录结构:

my-git-root
    web-app
       ...
    docker
        Dockerfile
        build.sh
        site-conf
问题是,至少在某种程度上,docker的上下文是我的git root/docker/

本着不可变服务的精神,我希望容器具有git存储库的快照,而不是在容器中安装git并提取数据。但我不知道如何实现这一点,除非我将docker的内容分离到一个单独的git存储库,然后git在每个构建中克隆web应用程序——我甚至不想让任何人被git吸引到一个活动容器中

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

“本着不变服务的精神,…提取数据”

如果您在dockerfile中执行此操作,那么这将在容器创建时发生,而不是在运行时。因此,容器的每个版本都有特定的数据版本。如果您使用与web应用程序repo的发布标记匹配的标记部署容器,那么您在每个容器中运行的web应用程序版本将相当清楚

“apt获取安装git”

您可以使用github的http接口在特定标记处下载webapp的tarball或提交哈希,这样就不会引入最新的、可能已损坏的webapp

在Dockerfile中我想说

如果将dockerfile移动到git repo的根目录,则可以使用copy命令,正如您所示,因为整个代码都成为docker上下文的一部分。这是docker回购协议的常见做法

“关于更合理工作流的建议…”

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

有时,如果您在Amazon Elastic beanstalk上运行,您将无法访问主机fs。在这种情况下,我建议使用与上面提到的nginx容器相同的通用容器。然后在web应用程序项目的根目录中创建一个dockerfile,该文件使用myNginx:version6的
,只需将web应用程序文件夹复制到正确的位置即可。此容器可以与
myApp:SomeVersion
一起部署。通过这种方式,您将引入一个众所周知的Nginx容器,其中包含所有与部署相关的问题,以及使用您的代码进行版本控制的myApp容器

Solomon Hykes在讨论这些方法时解决了这个问题。

yes“将dockerfile移到git回购的根目录”-1关于“将web应用程序作为卷安装”。这不是“不变服务的精神”。
my-git-root
    web-app
       ...
    docker
        Dockerfile
        build.sh
        site-conf