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

app3的所有者(以前)不会打扰或了解其他应用程序的设置,并且很乐意采用其他应用程序的默认设置。质量检查小组也将不依赖默认配置来设置应用程序。

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

要求是:

  • 使用默认配置为每个应用程序创建docker容器,以便所有应用程序(通过docker-compose安装)均已预先配置并启动,而无需进行任何其他工作。
  • 能够将最新代码更改更新到docker容器


  • 好吧, docker 是一个很好的解决方案,我们可以完成大部分任务。但是,以下是问题:
  • 在docker构建过程中,不支持env变量(而且不太可能)。但是我们不能在Dockerfile中对git存储库凭据进行硬编码。我们需要一个预先配置的应用程序设置,但是我无法找到一种更简单的方法来将git中的代码获取到docker镜像中。
  • 对于git代码库中的简单更改,无需创建新的docker镜像。相反,应该可以在容器内运行“git pull”。 (此外,对于该应用程序的开发人员而言,也可以在容器本身内部进行“git push”操作-使开发人员测试更加容易)。对于所有这些,git凭证必须是正在使用该凭证的那个特定开发人员的凭证。
  • 将git存储库安装在主机上并使用docker卷(-v)引用太笨拙了。 [如果开发人员希望这样做,他们仍然可以这样做-但我不希望将此作为默认设置]

  • 任何建议欢迎!

    最佳答案

    使您的应用程序进入Docker镜像的更简单方法通常是使用ADD命令。

    假设您的存储库如下所示:

    .git
    my_app_stuff/
    more_app_stuff/
    

    然后只需将Dockerfile放在.git旁边,并使用:
    ADD . /app
    

    当您从该目录运行docker build .时,您的应用程序将通过/app注入(inject)到容器中。

    现在,这还不能完全解决,因为它还会将.git加载到您的图像中,您可能要避免这样做(尤其是如果您在.git/config中包含凭据!)。

    要解决此问题,只需添加包含.dockerignore.git纯文本文件,告诉Docker它应忽略此目录。

    最后,您的树应如下所示:
    .dockerignore
    .git
    my_app_stuff/
    more_app_stuff/
    

    请注意,如果开发人员愿意,他们可以使用-v ...将应用程序的本地副本安装在/app上,并覆盖图像中内置的副本。

    现在,就从容器打包到git pull而言,这还不能完全解决您的问题。

    如果确实要执行此操作,则需要将.git保留在其中,并确保在启动容器时(可能通过卷或环境变量)以某种方式将有效凭据传递给了容器。

    关于git - docker:在docker镜像中从git安装应用程序代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32591659/

    10-16 18:34