Wie übergebe ich Argumente in Docker-Compose?

Antworten:

80

docker-composeUnterstützt jetzt die Variablensubstitution.

Compose verwendet die Variablenwerte aus der Shell-Umgebung, in der docker-composees ausgeführt wird. Angenommen, die Shell enthält POSTGRES_VERSION=9.3und Sie geben diese Konfiguration in Ihrer docker-compose.ymlDatei an:

db:
  image: "postgres:${POSTGRES_VERSION}"

Wenn Sie docker-compose upmit dieser Konfiguration ausführen , sucht Compose nach der POSTGRES_VERSIONUmgebungsvariablen in der Shell und ersetzt ihren Wert in. In diesem Beispiel löst Compose das imageto auf, postgres:9.3bevor die Konfiguration ausgeführt wird.

Hemerson Varela
quelle
3
Build-Argumente sind eine Docker 1.9-Funktion. In der Frage wurde gefragt, wie Docker Compose sie verwenden kann. Die variable Substitution hat nichts damit zu tun.
Jack
8
@Jack Ich weiß, dass dies keine direkte Antwort auf die Frage ist, aber es könnte eine Problemumgehung sein, da das docker-composekeine Übergabe von Argumenten unterstützt.
Hemerson Varela
18
@ Jack Ich kam hierher auf der Suche nach variabler Substitution, also war dies hilfreich für mich
Andy
Wird das vorerst nutzen. Kann nicht docker-compose runzum Übergeben von Argumenten verwendet werden, da das Argument an mehrere Container übergeben werden muss.
Andho
1
@ weberc2 Ich weiß, zu diesem Zeitpunkt hättest du es herausfinden sollen, aber ich werde es hier für andere belassen. Sie können es als Umgebung mit einem Standardwert in Ihrer docker-compose.ymlDatei festlegen . environment:\n PLATFORM_VERSION: "${PLATFORM_VERSION:-v1.0.0}". PS: \nNur weil ich keinen Weg gefunden habe, mehrzeiligen Codeblock in Kommentaren zu formatieren.
Sidney de Moraes
75

Dies kann jetzt ab Docker-Compose v2 + als Teil des buildObjekts erfolgen.

docker-compose.yml

version: '2'
services:
    my_image_name:
        build:
            context: . #current dir as build context
            args:
                var1: 1
                var2: c

Weitere Informationen finden Sie im Docker zum Erstellen von Dokumenten .

Im obigen Beispiel werden "var1" und "var2" an die Build-Umgebung gesendet.

Hinweis: Alle env-Variablen (die mithilfe des environmentBlocks angegeben werden), die denselben Namen wie die argsVariablen haben, überschreiben diese Variable.

tgallacher
quelle
@tfg Weißt du, ob die argsTasten in Kleinbuchstaben geschrieben werden müssen? In den Dokumenten und allen Beispielen, die ich gesehen habe, werden Kleinbuchstaben verwendet, aber ich habe nicht erwähnt, dass dies erforderlich ist .
pdoherty926
@ pdoherty926 Dies sollte nur eine Bash-Variablenerweiterung sein, daher sollten Groß- und Kleinbuchstaben mit Unterstrichen in Ordnung sein.
Tgallacher
@tfg Danke. Zu diesem Schluss bin ich inzwischen selbst gekommen. Haben Sie eine Idee, warum die Dokumente / Beispiele diese Konvention verwenden?
pdoherty926
1
Leider funktioniert dies nicht für Stapel: "Diese Option wird ignoriert, wenn ein Stapel im Schwarmmodus mit einer (Version 3) Compose-Datei bereitgestellt wird
joshmcode
@tgallacher AFAIK, die Variablen im environmentBlock überschreiben keine argsVariablen. Es ist nur so , dass argsVariablen während des Behälters zur Verfügung stehen Build - Prozess , aber environmentVariablen stehen zur Verfügung , während der Behälter läuft .
Massood Khaari