it-swarm.com.de

Docker-compose, bedingte Anweisung (z. B. Volume nur hinzufügen, wenn Bedingung)

Ich möchte meinem Dienst ein Volume hinzufügen, aber nur, wenn der Endbenutzer einen Ordner dafür angegeben hat. Andernfalls sollte kein Volume bereitgestellt werden, da das bereits vorbereitete Image gültige Daten in einem Standardordner enthält.

Das heißt, ich möchte so etwas tun; Pseudocode:

services:

  my_awesome_service:

    volumes:
      if ${VARIABLE} => ${VARIABLE}:/app/folder

Kann eine solche bedingte Anweisung in einer Docker-Compose-Datei erstellt und definiert werden? Die einzige Möglichkeit, dies zu ermöglichen, besteht darin, zunächst eine Basis-Docker-Compose-Datei zu definieren, für die kein Volume-Mount vorhanden ist, und dann eine zweite Docker-Compose-Datei aufzurufen, wenn der $VARIABLE definiert ist. Dies ist in Ordnung für eine einzelne oder wenige Bedingungen, wird aber böse, wenn es viele gibt.

Irgendeine Lösungsmöglichkeit?

2
juanmirocks

Derzeit gibt es nichts Vergleichbares. Optionen, um dies zu implementieren, umfassen:

  1. Erstellen Sie viele komponierte Dateien und fügen Sie die Teile zusammen, die Sie zum Erstellen der endgültigen Datei benötigen.

  2. Generieren Sie dynamisch Ihre Compose-Datei. So etwas wie jsonnet kann ein guter Ausgangspunkt sein.

  3. Überspringen Sie das Verfassen und generieren Sie dynamisch Ihren docker run -Befehl. Dies fängt an, nicht portabel zu sein, aber einige Anwendungsfälle lassen sich einfacher selbst erstellen.

  4. Senden Sie eine PR an die Repos compose und docker/cli github, um die Compose-Funktionalität zu erweitern. Dies mit einer Golang-Template-Syntax zu tun, wäre für mich am sinnvollsten.

4
BMitch

Ja, ich glaube nicht, dass das Format von docker-compose bedingte Anweisungen unterstützt.

Zwei Lösungen könnten jedoch sein:

  1. Übergeben Sie eine "komplexe" (listenähnliche) Variable an den Docker-Compose, z. B. in diesem Beispiel :

docker-compose.yaml:

command: ${COMMAND_PARAMS}

bash:

#!/bin/bash
if test -z $CONDITION; then
  params="-param1 ${MIPARAM1}"
else
  params="-param1 ${MIPARAM1} -param2 ${MIPARAM2}"
fi
COMMAND_PARAMS=$params docker-compose up

(Credits gehen an Originalposter auf Github, @ Shin-)

  1. Bereiten Sie den Standardordner im Docker-Image in einem Ordner mit dem Namen folder_defaults vor, und legen Sie das Volume immer in der Datei docker-compose.yml fest. Anschließend erstellen Sie im Docker-Image ein internes Skript, das prüft, ob der Volume-Ordner leer ist. und wenn ja, ln -s zum folder_defaults; Ansonsten lass es wie es ist.

Beispiel für das bedingte Skript:

if [ -z "$(ls -A /a/folder)" ]; then
  do something... using /a/folder_defaults
fi
0
juanmirocks

Wenn Sie Rancher für die Orchestrierung verwenden, sind Escapes {{...}}} verfügbar, die Sie für bedingte Anweisungen in Ranchers Version von docker-compose verwenden können.

Lesen Sie mehr über das integrierte GO-Template-System hier .

0
WeSee