繁体   English   中英

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

[英]Mount a volume in docker-compose conditionally

我有一个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

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

由于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

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

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

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

假设 .war 文件名是“app.war”……你可以使用这样的 env 变量覆盖它:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM