将 git 存储库添加到 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 在容器中安装 git 并提取数据。但是我不明白如何做到这一点,除非我将 docker 的东西分离到一个单独的 git 存储库中,然后在每次构建时 git 克隆 web 应用程序——我宁愿不让任何人甚至被诱惑去 git pull 在一个实时容器中。

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

"本着不变服务的精神,...拉取数据">

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

"apt-get install'ing git">

您可以使用 github 的 http 接口在特定标签或提交哈希处下载 Web 应用程序的压缩包,因此不会拉入最新的和可能损坏的 Web 应用程序。

在Dockerfile中,我想说...

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

"关于更理智的工作流程的建议..">

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

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

这里有一个关于这些方法的讨论,所罗门·海克斯(Solomon Hykes(在其中解决了这个问题。

最新更新