Programme steuern den Betrieb häufig über eine mit der Software gebündelte Konfiguration, und Umgebungsvariablen ermöglichen Benutzern, sie zur Laufzeit festzulegen. Das Ausführen von Prozessen in Docker-Containern macht die Dinge jedoch komplizierter. Wie übergeben Sie also Umgebungsvariablen an einen Container?
Wofür werden Umgebungsvariablen verwendet?
Umgebungsvariablen ermöglichen es Ihnen, die Konfiguration von der ausführbaren Datei der Anwendung zu entkoppeln. Beispielsweise möchten Sie Ihr Produktionsdatenbankpasswort nicht in Ihrer Codebasis speichern – wenn Sie dies tun würden, wäre es von Git aus sichtbar, und jeder mit Zugriff auf Ihren Code könnte Ihre Datenbank lahmlegen.
Stattdessen legen Sie ihn mit einer Umgebungsvariablen fest, die ein einfaches Schlüssel/Wert-Paar speichert und Ihnen den Zugriff auf den Wert in jeder Anwendung ermöglicht, die in derselben Shell-Sitzung ausgeführt wird (sie sind nicht global zugänglich). Dies hat auch den Vorteil, dass unterschiedliche Konfigurationen für unterschiedliche Umgebungen einfach definiert werden können. Beispielsweise separate Schlüssel für Entwicklungs- und Produktionsdatenbanken oder Verwendung eines anderen API-Endpunkts.
Das Festlegen dieser Variablen für Docker-Container kann auf drei Arten erfolgen – mit CLI-Argumenten, .env
config-Dateien oder über docker-compose
.
Mit einem Befehlszeilenargument
Der Befehl zum Starten von Docker-Containern, docker run
, akzeptiert ENV-Variablen als Argumente. Führen Sie es einfach mit dem -e
aus Flag, Abkürzung für --env
, und übergeben Sie das Schlüssel=Wert-Paar:
sudo docker run -e POSTGRES_USER='postgres' -e POSTGRES_PASSWORD='password' ...
Und wenn Sie diese Umgebungsvariablen bereits in der Umgebung festgelegt haben, in der dieser Befehl ausgeführt wird, können Sie sie einfach direkt namentlich übergeben:
// set variable POSTGRES_PASSWORD='password' // use it later docker run -e POSTGRES_PASSWORD -e POSTGRES_USER ...
Zusätzliche Sicherheit mit einer .env-Datei
Das Übergeben von Variablen mit CLI-Argumenten funktioniert hervorragend, hat aber einen Nachteil – diese Variablen sind vom Host aus sichtbar. Sie werden im Befehlsverlauf protokolliert und sind in der Prozessliste für den gestarteten Prozess sichtbar.
Linux hat eine eingebaute Möglichkeit, Berechtigungen dafür zu verwalten – Dateizugriff. Speichern der Variablen in einer .env
Datei können Sie den Zugriff auf diese Datei mit Dateiberechtigungen steuern (chmod
, chown
).
Erstellen Sie eine .env
Datei mit Variablen im folgenden Format, jeweils in einer neuen Zeile:
POSTGRES_PASSWORD='password' POSTGRES_USER='postgres' APPLICATION_URL='example.com'
Übergeben Sie es dann an docker run
mit der --env-file
Flagge:
docker run --env-file ./envfile ...
Mit Docker-Compose
Natürlich starten viele Leute Docker-Container nicht direkt mit docker run
, und entscheiden Sie sich stattdessen für die Verwendung eines docker-compose
Datei, um die Konfiguration mehrerer Container zu handhaben, die alle eine einzige Anwendung darstellen.
Um Umgebungsvariablen an einen auf diese Weise gestarteten Container zu übergeben, müssen Sie die Compose-Datei so konfigurieren, dass die Variablen der Sitzung an den Docker-Container weitergeleitet werden. Diese Konfiguration übergibt hier den POSTGRES_USER
-Variable sowohl für die Erstellungsumgebung als auch für die Laufzeitumgebung und legt einen Standardwert fest, falls er nicht vorhanden ist.
version: '3.1' services: my-service: build: context: . args: - POSTGRES_USER=${POSTGRES_USER:-default} environment: - POSTGRES_USER=${POSTGRES_USER:-default}
Sie müssen die Umgebungsvariablen festlegen, bevor Sie docker-compose up
ausführen , andernfalls kann nicht darauf zugegriffen werden. Sie könnten sie in der Compose-Datei speichern, aber das wird normalerweise nachverfolgt und versioniert, was den Zweck von env-Variablen zunichte macht.
Mit Kubernetes
Kubernetes ist ein Orchestrierungssystem, das Hunderte von Containern in einem Netzwerk ausführen kann. Es verwendet immer noch Docker, aber Sie werden immer nur die Konfiguration berühren, sodass die direkte Übergabe von Umgebungsvariablen nicht funktioniert.
Stattdessen können Sie sie in der Konfiguration für den Pod definieren:
apiVersion: v1 kind: Pod metadata: name: example spec: containers: - ... env: - name: SERVICE_PORT value: "80" - name: SERVICE_IP value: "172.17.0.1"
Kubernetes ist kompliziert und es gibt viele verschiedene Möglichkeiten, mit Umgebungsvariablen zu arbeiten. Um mehr zu erfahren, können Sie ihre Leitfäden zum Einfügen von Daten in Pods lesen.