web-dev-qa-db-fra.com

Monter un volume dans docker-compose sous condition

J'ai un docker-compose.yml configuration. L'un des conteneurs est un serveur Tomcat et il a un _ .war fichier déployé dans le répertoire webapps.

Je veux avoir la possibilité de passer (remplacer) l'archive war à déployer par certains qui réside sur la machine hôte. Je pense que le mieux serait d'avoir en quelque sorte la possibilité de changer/remplacer le démarrage docker-compose: par défaut, je veux exécuter la webapp (fichier war) qui est à l'intérieur du conteneur, mais je veux avoir la possibilité de monter un répertoire à partir de mon hôte (par exemple pendant le développement/débogage) si besoin est.

Actuellement, j'ai la ligne suivante dans mon docker-compose.yml, qui est commenté si j'ai besoin de la valeur par défaut.

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

Y a-t-il une meilleure façon de réaliser cela?

19
fxmasa

Au lieu de (pas) monter un volume commentant cette ligne, j'utiliserais https://docs.docker.com/compose/extends/#example-use-case pour exécuter une extension de service qui spécifie un volume.

Je fais cela pour résoudre deux problèmes différents:

  • Je ne spécifie pas de volume lorsque l'image de docker est destinée à être exécutée en production et contient tous les fichiers nécessaires.
  • Je spécifie un volume lors du développement, pour vérifier les changements en direct.
10
dgulabs

Disons que le nom de fichier .war est "app.war" ... vous pouvez le remplacer en utilisant une variable env comme celle-ci:

 volumes: 
 - ./application/webapps/${APPLICATION_ENV}.war:/usr/local/Tomcat/webapps/app.war

Ensuite, lorsque vous devez exécuter un autre fichier war, modifiez simplement le APPPLICATION_ENV valeur à celle dont vous avez besoin pour exécuter et redémarrer le conteneur.

Je ne pense pas docker-compose possède des "volumes conditionnels", mais de cette façon, vous pouvez modifier app.war en fonction de votre environnement.

Une autre façon serait d'exécuter un script après le docker-compose up/start pour l'écraser et ne le faire qu'en cas de besoin, comme:

 docker-compose exec nom-de-votre-conteneur cp /a/volume/path/app.war /usr/local/Tomcat/webapps/app.war
3