Compose: Umgebungsvariablen mit Standardwerten sind in Compose nicht verfügbar

Erstellt am 13. Feb. 2017  ·  3Kommentare  ·  Quelle: docker/compose

Das Thema

Die Verfügbarkeit von Umgebungsvariablen in der Compose-Datei wird wie folgt bereitgestellt:

  • Shell- oder .env-Datei
  • in Compose-Datei definiert

fühlt sich inkonsistent an. Umgebungsvariablen mit Standardwerten sind innerhalb von Compose nicht verfügbar, es sei denn, sie werden explizit von außerhalb bereitgestellt.

Das Beispiel

Betrachten Sie die folgende minimale Compose-Datei:

version: '3'
services:
    example:
        environment:
            TAG: edge
        image: alpine:${TAG}

Die Variable ${TAG} ist _nirgendwo_ in der Compose-Datei verfügbar.

Z.B:

$ docker-compose up
WARNING: The TAG variable is not set. Defaulting to a blank string.
Pulling example (alpine:latest)...
...

Aber:

$ TAG=edge docker-compose up
Pulling example (alpine:edge)...
...

das $TAG ist jetzt in der Compose-Datei verfügbar.

Das Ergebnis

Es ist erforderlich, immer explizit env-Variablenwerte bereitzustellen, um sie in der Compose-Datei verwenden zu können.

Es ist natürlich zu erwarten, dass alle env-Variablen in der Compose-Datei verfügbar sind/aufgelöst werden, insbesondere diejenigen, die von ihr ursprünglich definiert wurden. Obwohl dies nicht der Fall zu sein scheint.

Tut mir leid, wenn dies schon einmal beantwortet wurde, ich habe diesen speziellen Anwendungsfall in der Problemliste nicht gefunden.

Technische Daten:

$ docker version
Client:
 Version:      1.13.1
 API version:  1.26
 Go version:   go1.7.5
 Git commit:   092cba3
 Built:        Wed Feb  8 08:47:51 2017
 OS/Arch:      darwin/amd64

Server:
 Version:      1.13.1
 API version:  1.26 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   092cba3
 Built:        Wed Feb  8 08:47:51 2017
 OS/Arch:      linux/amd64
 Experimental: true
$ docker-compose version
docker-compose version 1.11.1, build 7c5d5e4
docker-py version: 2.0.2
CPython version: 2.7.12
OpenSSL version: OpenSSL 1.0.2j  26 Sep 2016
kinquestion

Hilfreichster Kommentar

Bitte beachten Sie die Seite zur Begriffsklärung: https://docs.docker.com/compose/environment-variables/

Kurz gesagt, der Eintrag environment in Ihrer Compose-Datei deklariert die Umgebungsvariablen, die zur Laufzeit in Ihrem Container/Dienst verfügbar sind. Die Variablensubstitution hingegen erfolgt unter Verwendung der Variablen, die auf dem Host vorhanden sind, auf dem docker-compose ausgeführt wird. Das sind zwei verschiedene Sets und sollten getrennt bleiben.

Alle 3 Kommentare

Bitte beachten Sie die Seite zur Begriffsklärung: https://docs.docker.com/compose/environment-variables/

Kurz gesagt, der Eintrag environment in Ihrer Compose-Datei deklariert die Umgebungsvariablen, die zur Laufzeit in Ihrem Container/Dienst verfügbar sind. Die Variablensubstitution hingegen erfolgt unter Verwendung der Variablen, die auf dem Host vorhanden sind, auf dem docker-compose ausgeführt wird. Das sind zwei verschiedene Sets und sollten getrennt bleiben.

Danke für die Klarstellung!

Ich bin jetzt auf das gleiche Problem gestoßen, kann es aber nicht beheben. Ich habe ein Shell-Skript, das den docker-compose-Aufruf umschließt:

...
docker-compose $DOCKER_COMPOSE_FILES up $@
...

DOCKER_COMPOSE_FILES ist ein String mit "-f file1.yml -f file2.yml ...". Es funktioniert alles gut.

Mein Docker-Compose-Image-Eintrag lautet:

...
image: "...-service:${DOCKER_TAG}"
...

Ich habe mehrere Möglichkeiten versucht:

  • So beziehen Sie die Datei mit dem DOCKER_TAG im Shell-Skript
  • DOCKER_TAG manuell im Shell-Skript exportieren
  • Rufen Sie docker-compose mit DOCKER_TAG vor:
    DOCKER_TAG=... docker-compose...

Nichts funktioniert - DOCKER_TAG ist nicht verfügbar. Weiß jemand was ich falsch mache?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen