Docker Schnellstart – Umgebungsvariablen nutzen
Oft ist es eine gute Idee, unsere Dienste von ihrer Konfiguration zu trennen. Für eine 2-Factor-App sollten wir die Konfiguration in der Umgebung speichern.
Das bedeutet natürlich, dass wir einen Weg brauchen, um die Konfiguration in unseren Service zu bekommen. In dieser Lektion werden wir dies erreichen, indem wir Umgebungsvariablen an einen Docker-Container übergeben.
Mit -env, -e
In dieser Lektion werden wir ein kleines (5MB) Linux Image namens Alpine verwenden. Beginnen wir damit, das Image lokal zu pullen/ziehen:
docker pull alpine:3
Wenn wir unseren Docker-Container starten, können wir Umgebungsvariablen als Key-Value-Paare direkt in die Kommandozeile übergeben, indem wir den Parameter -env (oder seine Kurzform -e) verwenden.
Lass uns zum Beispiel den folgenden Befehl ausführen:
docker run --env VARIABLE1=foobar alpine:3 env
Einfach gesagt, spiegeln wir die Umgebungsvariablen, die wir gesetzt haben, zurück auf die Konsole:
VARIABLE1=foobar
Wie du siehst, interpretiert der Docker Container die Variable VARIABLE1 korrekt.
Außerdem können wir den Wert in der Kommandozeile weglassen, wenn die Variable bereits in der lokalen Umgebung existiert.
Lass uns zum Beispiel eine lokale Umgebungsvariable definieren:
export VARIABLE2=foobar2
Dann werden wir die Umgebungsvariable ohne ihren Wert angeben:
docker run --env VARIABLE2 alpine:3 env
Und wir können sehen, dass Docker immer noch den Wert aufgenommen hat, dieses Mal aus der Umgebung:
VARIABLE2=foobar2
Verwendung von -env-file
Die obige Lösung ist ausreichend, wenn die Anzahl der Variablen gering ist. Sobald wir aber mehr als eine Handvoll Variablen haben, kann es schnell umständlich und fehleranfällig werden.
Eine alternative Lösung ist die Verwendung einer Textdatei, um unsere Variablen zu speichern, unter Verwendung des Standard Schlüssel=Wert-Formats.
Lass uns ein paar Variablen in einer Datei definieren, die wir my-env.txt nennen:
echo VARIABLE1=foobar1 > my-env.txt
echo VARIABLE2=foobar2 >> my-env.txt
echo VARIABLE3=foobar3 >> my-env.txt
Nun packen wir diese Datei in unseren Docker-Container:
docker run --env-file my-env.txt alpine:3 env
Zum Schluss werfen wir noch einen Blick auf die Ausgabe:
VARIABLE1=foobar1
VARIABLE2=foobar2
VARIABLE3=foobar3
Docker Compose verwenden
Docker Compose bietet auch die Möglichkeit, Umgebungsvariablen zu definieren. Wenn du dich für dieses Thema interessierst, schau dir unser Docker Compose Tutorial an, um mehr Details zu erfahren.
Vorsicht bei sensiblen Daten
Meistens wird eine der Variablen ein Passwort für eine Datenbank oder einen externen Dienst sein. Wir müssen vorsichtig sein, wie wir diese Variablen in den Docker Container bekommen.
Diese Werte direkt über die Kommandozeile zu übergeben, ist wahrscheinlich am unsichersten, da das Risiko größer ist, dass die sensiblen Werte irgendwo landen, wo wir es nicht erwarten, wie z.B. in unserem Source Control System oder der OS Prozessliste.
Sensible Daten in der lokalen Umgebung oder in einer Datei zu definieren ist die bessere Wahl, da beides vor unbefugtem Zugriff gesichert werden kann. Es ist jedoch wichtig zu wissen, dass jeder Benutzer mit Zugriff auf die Docker-Laufzeit einen laufenden Container inspizieren und die geheimen Werte entdecken kann.
Lass uns einen laufenden Container anschauen:
docker inspect 2b6d037i3270
Die Ausgabe zeigt die Umgebungsvariablen an:
"Config": {
// ...
"Env": [
"VARIABLE1=foobar1",
"VARIABLE2=foobar2",
"VARIABLE3=foobar3",
// ...
]
}
Für die Situationen, in denen Sicherheit ein Thema ist, ist es wichtig zu erwähnen, dass Docker einen Mechanismus namens Docker Secrets anbietet. Auch Containerdienste, wie die von Kubernetes, AWS oder Azure, bieten ähnliche Funktionalitäten.
Fazit
In dieser Lektion haben wir uns verschiedene Möglichkeiten angeschaut, wie man Umgebungsvariablen in einen Docker Container bekommt. Während jeder Ansatz gut funktioniert, hängt unsere Wahl letztendlich von verschiedenen Parametern ab, wie zum Beispiel Sicherheit und Wartbarkeit.