我正在部署一个nginx实例。 dockerfile以及nginxconfiguration数据和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
问题,至less部分是docker的上下文是my-git-root / docker /。
本着不可变服务的精神,我希望容器具有git存储库的快照,而不是apt-get install'ing容器中的git并提取数据。 但我不明白如何做这个工作,除非我分离出docker的东西到一个单独的git仓库,然后git克隆每个版本的Web应用程序 – 我宁愿不让任何人甚至被诱惑git拉住容器。
关于更理智的工作stream程的build议?
“本着不可改变的服务精神,拉动数据”
如果你在你的dockerfile中这样做,那么这发生在容器创建时间,而不是运行时。 因此,每个版本的容器都将具有特定版本的数据。 如果您使用与您的Web应用程序回购的版本标签相匹配的标签来部署容器,则会很清楚您在每个容器中运行的是哪个版本的Web应用程序。
“apt-get install'ing git”
你可以使用github的http界面以特定的标签下载webapp的压缩包或者提交哈希,因此不会在最新的和可能断开的webapp中拉动。
在Dockerfile中我想说…
如果您将dockerfile移动到git repo的根目录,您可以使用copy命令,因为整个代码已成为docker上下文的一部分。 这在码头回购中是很常见的做法。
“关于更理智的工作流程的建议..”
我建议在自己的git仓库中有一个通用的nginx容器,不会在构建时复制web-app / serve。 从运行你的代码的主机安装web-app作为一个卷。 然后你可以使用任何方法(docker外部)来获取你的当前代码状态到服务器上。 码头容器在任何时候都可以独立于代码的状态。 这将有助于在需要修复nginx设置时不必查找容器中的代码。
有时你不能访问主机FS,即如果你在Amazon Elastic Beanstalk上运行。 在这种情况下,我会建议有上面提到的nginx容器相同的通用容器。 然后在web应用程序项目的根目录下有一个dockerfile,它with myNginx:version6
使用with myNginx:version6
web-app文件夹复制到正确的位置。 这个容器可以使用myApp:SomeVersion
进行部署。 通过这种方式,您可以使用与您的代码版本相关的任何与部署相关的问题和myApp容器的着名Nginx容器。
这里有一个关于这些方法的讨论,所罗门·海克斯(Solomon Hykes)解决了这个问题。