docker:在Docker镜像中从git安装应用程序代码

我有多个Web应用程序(app1,app2,app3 … appN),每个应用程序(通过http)互相交互。 每个Web应用程序将运行在一个单独的泊坞窗容器中。 通过从git安装代码,设置数据库默认值并运行一些初始化来安装每个应用程序。 所有的应用程序将运行在一个主机(每个开发者将有他们/她的系统上的所有应用程序的副本)。

app3的所有者(对于前者)不会打扰或了解其他应用程序的设置,并会很乐意采取其他应用程序的默认设置。 QA团队也不了解如何设置应用程序,依靠默认的configuration。

注意:git存储库是密码authentication的。

要求是有:

  • 使用默认configuration为每个应用程序创buildDocker容器,以便所有应用程序(通过docker-compose安装)都已预先configuration,并且无需额外工作就可以启动。
  • 能够将最新的代码更改更新到Docker容器中

那么,docker是一个很好的解决scheme,我们可以完成其中大部分。 但是,以下是问题:

  1. 在docker构build过程中,不支持envvariables(不太可能)。 但是我们不能在Dockerfile中硬编码git仓库信息。 我们需要一个预先configuration的应用程序设置,但是我无法想象一个更简单的方法从git获取代码到docker镜像中。

  2. 对于git代码库的简单修改,不需要创build一个新的docker镜像。 相反,应该可以在容器内运行“git pull”。 (另外,对于该应用程序的开发人员,也可以在容器内部执行“git push” – 使开发testing更容易)。 对于所有这一切,git凭证需要是使用此特定开发人员。

  3. 在主机上安装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)时,有效的证书以某种方式传递给你的容器。