GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

So übergeben Sie Umgebungsvariablen an Docker-Container

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.


Docker
  1. So aktualisieren Sie laufende Docker-Container automatisch

  2. So exportieren und importieren Sie Docker-Container

  3. So verwenden Sie Docker Compose

  4. Wie viele Umgebungsvariablen nicht gesetzt sind

  5. So entfernen Sie alle Docker-Container

So führen Sie Docker-Container aus

So entfernen Sie Docker-Container

So stoppen Sie Docker-Container

So benennen oder umbenennen Sie Docker-Container

So verwalten Sie Docker-Container

So konfigurieren Sie Netzwerk-Namespaces in Docker-Containern