将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进行实时直播容器.

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

最佳答案

“In the spirit of immutable services,… pulling the data”

如果您在dockerfile中执行此操作,则此操作会在容器创建时而不是运行时发生.因此,容器的每个版本都将具有特定版本的数据.如果您使用与您的Web应用程序回购的发布标签相匹配的标签来部署容器,则可以很清楚地看到每个容器中正在运行哪个版本的Web应用程序.

“apt-get install’ing git”

您可以使用github的http界面在特定标记处下载Webapp的tarball或提交哈希,因此不会拖入最新的和可能已损坏的webapp.

In Dockerfile I want to say…

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

“Suggestions on a more sane workflow..”

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

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

所罗门·海克斯(Solomon Hykes)讨论了有关这些方法here的问题.

相关文章

文章浏览阅读3.7k次,点赞2次,收藏5次。Nginx学习笔记一、N...
文章浏览阅读1.7w次,点赞14次,收藏61次。我们在使用容器的...
文章浏览阅读1.4k次。当用户在访问网站的过程中遇到404错误时...
文章浏览阅读2.7k次。docker 和 docker-compose 部署 nginx+...
文章浏览阅读1.3k次。5:再次启动nginx,可以正常启动,可以...
文章浏览阅读3.1w次,点赞105次,收藏182次。高性能:Nginx ...