web-dev-qa-db-fra.com

Docker-compose, instruction conditionnelle (par exemple, ajouter du volume uniquement si la condition)

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?

15
juanmirocks

Rien de tel n'existe actuellement. Les options pour implémenter cela que je peux trouver incluent:

  1. 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.

  2. Générez dynamiquement votre fichier de composition. Quelque chose comme jsonnet peut être un bon point de départ.

  3. 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.

  4. 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.

4
BMitch

Solution du pauvre:

    volumes:
      ${VARIABLE:-/dev/null}:/app/folder

Ou:

    volumes:
      ${VARIABLE:-/dev/null}:${VARIABLE:-/tmp}/app/folder
1
gatopeich

Ouais, je ne pense pas que le format de docker-compose supporte les instructions conditionnelles.

Cependant, deux solutions pourraient être:

  1. Passez une variable "complexe" (de type liste) au docker-compose comme dans cet exemple :

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-)

  1. Préparez le dossier par défaut dans l'image de docker dans un dossier nommé quelque chose comme 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
0
juanmirocks

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 .

0
WeSee