我有多个网络应用程序(app1,app2,app3 ... appN),每个都相互交互(通过http)。每个Web应用程序都将在单独的docker容器中运行。通过安装git中的代码,设置数据库默认值并运行一些初始化来安装每个应用程序。所有应用程序都将在一个主机上运行(每个开发人员都将拥有他/她的系统上所有应用程序的副本)。
app3的所有者(对于ex)不会打扰或了解其他应用设置,并且很乐意采用其他应用的默认设置。 QA团队也不知道如何设置应用程序,依赖于默认配置。
注意:git存储库已通过密码验证。
要求是:
好吧,docker是一个很好的解决方案,我们可以完成大部分工作。但是,以下是问题:
在docker构建过程中,不支持env变量(并且不太可能)。但我们不能在Dockerfile中硬编码git存储库凭据。我们需要一个预配置的应用程序设置,但我无法找到一种更简单的方法将代码从git导入docker镜像。
对于git代码库的简单更改,无需创建新的docker镜像。相反,应该可以运行" git pull"从容器内。 (此外,对于该应用程序的开发人员,也可以在容器内部执行" git push" - 使开发测试更容易)。对于所有这些,git凭据必须是使用它的特定开发人员。
在主机上安装git存储库并使用docker卷(-v)引用它太笨拙了。 [如果开发者希望这样做,他们仍然可以这样做 - 但我不希望这是默认的]
欢迎任何建议!
答案 0 :(得分:3)
将应用程序放入Docker镜像的更简单方法通常是使用ADD
命令。
假设您的存储库看起来像这样:
.git
my_app_stuff/
more_app_stuff/
然后将Dockerfile
放在.git
旁边,然后使用:
ADD . /app
当您从该目录运行docker build .
时,您的应用将被注入/app
的容器中。
现在,它还没有完成,因为它还会将.git
加载到您的图片中,您可能希望避免这种情况(特别是如果您在.git/config
中添加了凭据!)
要解决此问题,只需通过添加包含.dockerignore
的{{1}}纯文本文件告诉Docker它应该忽略此目录。
最后,您的树应如下所示:
.git
请注意,如果开发人员愿意,他们可以使用.dockerignore
.git
my_app_stuff/
more_app_stuff/
在-v ...
处安装应用的本地副本,并覆盖图片中内置的应用。
现在,就容器中的/app
打包而言,这并不能完全解决您的问题。
如果实际想要这样做,您需要在其中保留git pull
,并确保在启动时以某种方式将有效凭据传递给您的容器(可能通过音量或环境变量)。