在 docker 中安装卷 - 有条件地撰写
Mount a volume in docker-compose conditionally
我有一个 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
有没有更好的方法来实现?
假设 .war 文件名为 "app.war"...您可以使用这样的环境变量覆盖它:
volumes:
- ./application/webapps/${APPLICATION_ENV}.war:/usr/local/tomcat/webapps/app.war
然后,当您需要 运行 一个不同的 war 文件时,只需将 APPPLICATION_ENV
值更改为您需要 运行 的值,然后重新启动容器。
我不认为 docker-compose
确实有 "conditional volumes",但是这样你可以根据你的环境改变 app.war。
其他方法是 运行在 docker-compose up/start
之后编写一个脚本来覆盖它,并且只在需要时执行,例如:
docker-compose exec your-container-name cp /a/volume/path/app.war /usr/local/tomcat/webapps/app.war
我将使用 https://docs.docker.com/compose/extends/#example-use-case 到 运行 指定卷的服务扩展,而不是(不)安装卷注释掉该行。
我这样做是为了解决两个不同的问题:
- 当 docker 映像用于 运行 生产并且捆绑了所有必需的文件时,我没有指定卷。
- 我在开发期间指定了一个卷,以检查实时更改。
由于 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
我有一个 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
有没有更好的方法来实现?
假设 .war 文件名为 "app.war"...您可以使用这样的环境变量覆盖它:
volumes: - ./application/webapps/${APPLICATION_ENV}.war:/usr/local/tomcat/webapps/app.war
然后,当您需要 运行 一个不同的 war 文件时,只需将 APPPLICATION_ENV
值更改为您需要 运行 的值,然后重新启动容器。
我不认为 docker-compose
确实有 "conditional volumes",但是这样你可以根据你的环境改变 app.war。
其他方法是 运行在 docker-compose up/start
之后编写一个脚本来覆盖它,并且只在需要时执行,例如:
docker-compose exec your-container-name cp /a/volume/path/app.war /usr/local/tomcat/webapps/app.war
我将使用 https://docs.docker.com/compose/extends/#example-use-case 到 运行 指定卷的服务扩展,而不是(不)安装卷注释掉该行。
我这样做是为了解决两个不同的问题:
- 当 docker 映像用于 运行 生产并且捆绑了所有必需的文件时,我没有指定卷。
- 我在开发期间指定了一个卷,以检查实时更改。
由于 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