Je veux ajouter un volume à mon service, mais uniquement si l'utilisateur final lui a donné un dossier. Sinon, aucun volume ne doit être monté, car l'image déjà préparée contient des données valides dans un dossier par défaut.
Autrement dit, je veux faire quelque chose comme; pseudocode:
services:
my_awesome_service:
volumes:
if ${VARIABLE} => ${VARIABLE}:/app/folder
Établir une telle instruction conditionnelle est-il faisable et définissable dans un fichier docker-compose? La seule façon que je vois pour rendre cela possible est de définir d'abord un fichier docker-compose de base, qui n'a pas le montage de volume et l'appel sur un deuxième fichier docker-compose uniquement si le $VARIABLE
est défini. C'est bien pour une seule ou quelques conditions, mais devient désagréable s'il y en a plusieurs.
Toute solution?
Rien de tel n'existe actuellement. Les options pour implémenter cela que je peux trouver incluent:
Créez de nombreuses pièces de fichier de composition et fusionnez les pièces dont vous avez besoin pour créer le fichier final.
Générez dynamiquement votre fichier de composition. Quelque chose comme jsonnet peut être un bon point de départ.
Ignorez la composition et générez simplement votre docker run
commande. Cela commence à manquer de portabilité, mais certains cas d'utilisation sont simplement plus faciles à créer vous-même.
Soumettez un PR aux dépôts github de composition et de docker/cli pour étendre la fonctionnalité de composition. Faire cela avec une syntaxe de modèle golang aurait le plus de sens pour moi.
Solution du pauvre:
volumes:
${VARIABLE:-/dev/null}:/app/folder
Ou:
volumes:
${VARIABLE:-/dev/null}:${VARIABLE:-/tmp}/app/folder
Ouais, je ne pense pas que le format de docker-compose supporte les instructions conditionnelles.
Cependant, deux solutions pourraient être:
docker-compose.yaml:
command: ${COMMAND_PARAMS}
frapper:
#!/bin/bash
if test -z $CONDITION; then
params="-param1 ${MIPARAM1}"
else
params="-param1 ${MIPARAM1} -param2 ${MIPARAM2}"
fi
COMMAND_PARAMS=$params docker-compose up
(les crédits vont à l'affiche originale sur github, @ shin-)
folder_defaults
, puis définissez le volume toujours dans docker-compose.yml, mais enfin, ayez un script interne dans l'image docker qui vérifie si le dossier de volume est vide, et si c'est le cas ln -s
à la folder_defaults
; sinon laissez-le tel quel.Exemple de script conditionnel:
if [ -z "$(ls -A /a/folder)" ]; then
do something... using /a/folder_defaults
fi
Si vous utilisez Rancher pour l'orchestration, il y a des échappements {{...}}}
disponible, vous pouvez l'utiliser pour les instructions conditionnelles dans la version Rancher de docker-compose.
En savoir plus sur le système de modèles GO intégré ici .