docker:在docker image

时间:2015-09-15 16:58:11

标签: git docker dockerfile

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

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

注意:git存储库已通过密码验证。

要求是:

  • 使用默认配置为每个应用创建docker容器,以便预先配置所有应用(通过docker-compose安装),无需任何额外工作即可启动。
  • 能够将最新的代码更改更新到docker容器

好吧,docker是一个很好的解决方案,我们可以完成大部分工作。但是,以下是问题:

  1. 在docker构建过程中,不支持env变量(并且不太可能)。但我们不能在Dockerfile中硬编码git存储库凭据。我们需要一个预配置的应用程序设置,但我无法找到一种更简单的方法将代码从git导入docker镜像。

  2. 对于git代码库的简单更改,无需创建新的docker镜像。相反,应该可以运行" git pull"从容器内。 (此外,对于该应用程序的开发人员,也可以在容器内部执行" git push" - 使开发测试更容易)。对于所有这些,git凭据必须是使用它的特定开发人员。

  3. 在主机上安装git存储库并使用docker卷(-v)引用它太笨拙了。 [如果开发者希望这样做,他们仍然可以这样做 - 但我不希望这是默认的]

  4. 欢迎任何建议!

1 个答案:

答案 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,并确保在启动时以某种方式将有效凭据传递给您的容器(可能通过音量或环境变量)。