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

42

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

我希望能够传递(覆盖)要部署的war存档文件,该文件位于主机上。我认为最好的方法是有能力以某种方式切换/覆盖启动docker-compose:默认情况下,我想运行容器内部的Web应用程序(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

有没有更好的方法来实现这个目标?

3个回答

31
自从版本3中删除了extend,现在通过提供多个-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

if [ "$(uname -s)" == "Darwin" ]; then env_file="env/envMacOS" dc_extend="" else env_file="env/envUbuntu" dc_extend="-f docker-compose-linux.yml" fi # 复制docker所需的文件,但不在git中,因为它们是重复的 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 ``` - Rob Raymond

15

不要通过注释掉那行代码来(不)挂载卷,我会使用https://docs.docker.com/compose/extends/#example-use-case运行服务扩展来指定卷。

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

  • 当Docker镜像旨在在生产环境中运行并且已经捆绑了所有必要的文件时,我不会指定卷。
  • 在开发过程中,我会指定一个卷来检查实时更改。

4
假设.war文件名为 "app.war" …… 您可以使用环境变量覆盖它,如下所示:
volumes:
 - ./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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接