有条不紊地在docker-compose中装入卷

时间:2017-01-21 09:19:59

标签: docker docker-compose docker-volume

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

我希望能够传递(覆盖)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

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

3 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:7)

我会使用this example来运行指定卷的服务扩展名,而不是(不)安装注释掉该行的卷。

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

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

答案 2 :(得分:3)

让我们说.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