docker:在Docker镜像中从git安装应用程序代码
我有多个Web应用程序(app1,app2,app3 … appN),每个应用程序(通过http)互相交互。 每个Web应用程序将运行在一个单独的泊坞窗容器中。 通过从git安装代码,设置数据库默认值并运行一些初始化来安装每个应用程序。 所有的应用程序将运行在一个主机(每个开发者将有他们/她的系统上的所有应用程序的副本)。
app3的所有者(对于前者)不会打扰或了解其他应用程序的设置,并会很乐意采取其他应用程序的默认设置。 QA团队也不了解如何设置应用程序,依靠默认的configuration。
注意:git存储库是密码authentication的。
要求是有:
- 使用默认configuration为每个应用程序创buildDocker容器,以便所有应用程序(通过docker-compose安装)都已预先configuration,并且无需额外工作就可以启动。
- 能够将最新的代码更改更新到Docker容器中
那么,docker是一个很好的解决scheme,我们可以完成其中大部分。 但是,以下是问题:
-
在docker构build过程中,不支持envvariables(不太可能)。 但是我们不能在Dockerfile中硬编码git仓库信息。 我们需要一个预先configuration的应用程序设置,但是我无法想象一个更简单的方法从git获取代码到docker镜像中。
-
对于git代码库的简单修改,不需要创build一个新的docker镜像。 相反,应该可以在容器内运行“git pull”。 (另外,对于该应用程序的开发人员,也可以在容器内部执行“git push” – 使开发testing更容易)。 对于所有这一切,git凭证需要是使用此特定开发人员。
-
在主机上安装git存储库并使用docker卷(-v)进行引用太笨拙了。 [如果开发者希望这样做,他们仍然可以这样做 – 但是我不会把它当作默认]
任何build议欢迎!
让您的应用程序进入Docker镜像的更简单的方法通常是使用ADD
命令。
假设你的仓库如下所示:
.git my_app_stuff/ more_app_stuff/
然后,将您的Dockerfile
.git
旁边,然后使用:
ADD . /app
当你运行docker build .
从该目录中,您的应用程序将被注入到/app
的容器中。
现在,这并没有完成,因为它还会将.git
加载到您的图像中,您可能要避免这种情况(特别是如果您已将凭据包含在.git/config
!中)。
要解决这个问题,只需告诉Docker它应该通过添加一个包含.git
的.dockerignore
明文文件来忽略这个目录。
最后,你的树应该是这样的:
.dockerignore .git my_app_stuff/ more_app_stuff/
请注意,如果开发人员想要,他们可以使用-v ...
将应用程序的本地副本安装在/app
并覆盖图像中内置的一个。
现在,这并不能很好地解决你的问题,只要从集装箱中git pull
出来就行了。
如果你真的想这样做,你会希望在那里保存.git
,并确保当你启动它(也许通过一个卷或一个环境variables)时,有效的证书以某种方式传递给你的容器。