有条件地在 docker-compose 中挂载卷

Posted

技术标签:

【中文标题】有条件地在 docker-compose 中挂载卷【英文标题】:Mount a volume in docker-compose conditionally 【发布时间】:2017-06-06 06:26:27 【问题描述】:

我有一个docker-compose.yml 配置。在其中一个容器中有一个 Tomcat 服务器,它在 webapps 目录中部署了一些默认的 .war 文件。

我希望能够传递(覆盖)war 存档,以便由驻留在主机上的某些人部署。我认为最好的办法是能够以某种方式切换/覆盖从docker-compose 开始:默认情况下,我想运行容器内的 webapp(war 文件),但我希望有可能安装一个如果需要,来自我的主机的目录(例如在开发/调试期间)。

目前,我的docker-compose.yml 中有以下行,如果我需要默认值,则将其注释掉。

volumes:
# By default, there is the latest version of the application already present in the container
# If you want to provider the container with your own .war file, uncomment the following line
# - ./application/webapps:/usr/local/tomcat/webapps

有没有更好的方法来实现这一点?

【问题讨论】:

【参考方案1】:

由于extend 在版本 3 中已被删除,因此有一种新方法可以通过提供多个 -f 参数来覆盖设置,其中下一个文件扩展了前一个配置

文档在版本之间混合https://docs.docker.com/compose/extends/#multiple-compose-files

即在开发模式下运行

docker-compose -f docker-compose.yml -f docker-compose.dev.yml

docker-compose.yml 包含完整配置,docker-compose.dev.yml 仅添加一个卷

services:
  serviceA:
    volumes:
      -.:/usr/local/abc/service

【讨论】:

这种方法在我对主机 o/s #!/bin/bash if [ "$(uname -s)" == "Darwin" ]; then env_file="env/envMacOS" dc_extend="" else env_file="env/envUbuntu" dc_extend="-f docker-compose-linux.yml" fi # files required by docker but are not in git as they are duplicated cp $env_file .env cp ../requirements.txt . echo "***** ENV $env_file ****" docker-compose up -d --build htpc docker-compose -f docker-compose.yml $dc_extend up -d 987654327@ 有一些差异的情况下效果很好【参考方案2】:

我将使用https://docs.docker.com/compose/extends/#example-use-case 来运行指定卷的服务扩展,而不是(不)安装卷注释掉该行。

我这样做是为了解决两个不同的问题:

当 docker 映像要在生产环境中运行并且捆绑了所有必要的文件时,我没有指定卷。 我在开发期间指定了一个卷,以检查实时更改。

【讨论】:

【参考方案3】:

假设 .war 文件名为“app.war”...您可以使用这样的环境变量覆盖它:

卷: - ./application/webapps/$APPLICATION_ENV.war:/usr/local/tomcat/webapps/app.war

然后,当您需要运行不同的 war 文件时,只需将 APPPLICATION_ENV 值更改为您需要运行并重新启动容器的值。

我不认为docker-compose 确实有“条件卷”,但这样您就可以根据您的环境更改 app.war。

另一种方法是在docker-compose up/start 之后运行一个脚本来覆盖它,并且只在需要时才这样做,例如:

docker-compose exec your-container-name cp /a/volume/path/app.war /usr/local/tomcat/webapps/app.war

【讨论】:

以上是关于有条件地在 docker-compose 中挂载卷的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 docker compose 卷挂载 windows 文件夹?

Docker/Docker-Compose 中的 NFS 卷

在没有 noexec 选项的情况下将卷挂载到 docker 容器中

ECS 挂载卷到 nginx 容器

使用主机挂载卷的 Docker 权限开发环境

Docker 基础知识 - 使用卷(volume)管理应用程序数据