Wie setzt man Umgebungsvariablen in Docker?

Docker ist ein vielseitiges Tool, das eine einheitliche Entwicklungsumgebung über verschiedene Plattformen hinweg sicherstellt. Umgebungsvariablen spielen in Docker eine wichtige Rolle bei der Konfiguration von Anwendungen innerhalb eines Docker-Containers.

In dieser Anleitung erhalten Sie die wichtigsten Informationen zu Docker-Umgebungsvariablen. Außerdem erfahren Sie, wie Sie Docker-Umgebungsvariablen mit verschiedenen Methoden setzen, unter anderem wie Sie sie über Docker-CLI-Befehle und Docker Compose setzen oder überschreiben, und welche Best Practices Sie dabei beachten sollten.

Was sind Docker-Umgebungsvariablen?

Docker-Umgebungsvariablen sind vordefinierte Werte, die alle Anwendungen innerhalb eines Containers beeinflussen. Sie dienen verschiedenen Zwecken, etwa um das Verhalten von Anwendungen festzulegen, Konfigurationsparameter für Docker-Images zu setzen und sensible Informationen wie Datenbank-Zugangsdaten und API-Schlüssel sicher zu speichern.

Diese Variablen sind wichtig, um die Portabilität und Flexibilität des Containers zu verbessern. Mithilfe von Umgebungsvariablen können Sie Einstellungen an die jeweilige Bereitstellungsumgebung anpassen, ohne das Image neu zu erstellen. So lassen sich Konfigurationen zur Laufzeit einspielen, wodurch der Container in unterschiedlichen Umgebungen funktioniert und seine Portabilität insgesamt steigt. Die Umgebung des Containers wird nur gesetzt, wenn sie in der Service-Konfiguration explizit definiert ist.

Wie setzt man Docker-Umgebungsvariablen im Dockerfile?

Ein Dockerfile definiert alle notwendigen Schritte zum Erstellen eines Docker-Images und ermöglicht es Ihnen, zwei Arten von Variablen festzulegen:

ENV: Environment variables
ARG: Build-time variables

ENV-Variablen

Mit ENV festgelegte Umgebungsvariablen gelten für jeden Container, der aus dem Image erstellt wird. Das Format zum Setzen einer Umgebungsvariablen im Dockerfile sieht wie folgt aus:

ENV env_variable_name=value

ARG-Variablen

Build-Variablen werden mit ARG definiert und können beim Build übergeben werden.

Nachfolgend ein Beispiel für ein Dockerfile, das Umgebungsvariablen verwendet:

# Use an official Node.js runtime as a parent image
FROM node:14

# Set environment variables
ENV NODE_ENV=production
ENV PORT=3000

# Set the working directory
WORKDIR /usr/src/app

# Copy package.json and package-lock.json
COPY package*.json ./

# Install dependencies
RUN npm install

# Copy the rest of the application code
COPY . .

# Expose port 3000
EXPOSE 3000

# Run the app
CMD ["npm", "start"]

In diesem Beispiel sind NODE_ENV und PORT Umgebungsvariablen, die mit der ENV-Anweisung gesetzt werden. Diese Variablen stehen in jedem Container zur Verfügung, der aus diesem Dockerfile erstellt wird.

Docker-Umgebungsvariablen anzeigen: Variablen im Docker-Container anzeigen und verwalten

Um die in einem Docker-Container oder -Image gesetzten Umgebungsvariablen anzuzeigen, bietet Docker mehrere Methoden zum Debuggen und Untersuchen.

1. Mit dem Befehl docker inspect

Mit dem Befehl docker inspect können Sie detaillierte Informationen zu einem Container oder Image abrufen, einschließlich der Docker-Umgebungsvariablen. So verwenden Sie ihn:

docker inspect --format '{{.Config.Env}}' <containerId_or_imageId>

Ersetzen Sie <containerId_or_imageId> durch die tatsächliche ID Ihres Containers oder Images. Dieser Befehl ruft ausschließlich die Docker-Umgebungsvariablen (Env) ab und zeigt sie als formatierte JSON-Ausgabe an. Das ist nützlich, um schnell zu prüfen, welche Variablen aktuell in Docker-Instanzen konfiguriert sind.

2. Mit dem Befehl docker exec

Eine weitere Methode, um die konfigurierten Docker-Umgebungsvariablen anzuzeigen, ist der Befehl docker exec. So gehen Sie vor:

docker exec <containerID> env

Ersetzen Sie <containerID> durch die ID Ihres laufenden Containers. Dieser Befehl führt den Befehl env im angegebenen Container aus und listet alle Umgebungsvariablen auf, die darin aktuell gesetzt sind.

Wie setzt man Docker-Umgebungsvariablen mit Docker Compose?

Docker-Umgebungsvariablen zur Laufzeit über die CLI zu setzen, ist für Multi-Container-Anwendungen nicht ideal. Besser ist es, alle Umgebungsvariablen in einer Datei docker-compose.yml zu definieren. Diese Datei enthält alle notwendigen Konfigurationen für die Container, und Sie können sie beim Starten der Container mit einem einzigen Befehl anwenden. Um Umgebungsvariablen in einem Container mit Docker Compose zu setzen, müssen Sie diese Variablen in der Service-Konfiguration explizit definieren. 

Es gibt zwei Methoden, um Docker-Umgebungsvariablen mit Docker Compose zu setzen:

1. Mit dem Attribut environment

Bei dieser Methode definieren Sie Umgebungsvariablen direkt in der Datei docker-compose.yml mit dem Attribut environment. Als Beispiel nehmen wir eine Node-Anwendung, die mit einer MongoDB-Datenbank läuft:

Docker-Compose-Datei:

version: '3.8'
services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - PORT=3000
      - MONGO_URI=mongodb://mongo:27017/database_name
    depends_on:
      - mongo
  mongo:
    image: mongo:4.4
    ports:
      - "27017:27017"
    volumes:
      - mongo-data:/data/db
volumes:
  mongo-data:

2. Mit einer .env-Datei oder dem Attribut env_file

Bei dieser Methode speichern Sie Docker-Umgebungsvariablen in einer separaten .env-Datei und verweisen in der Datei docker-compose.yml auf diese Datei.

Hier ist die .env-Datei:

PORT=3000
MONGO_URI=mongodb://mongo:27017/database_name

Docker-Compose-Datei:

version: '3.8'
services:
  app:
    build: .
    ports:
      - "3000:3000"
    env_file:
      - .env
    depends_on:
      - mongo
  mongo:
    image: mongo:4.4
    ports:
      - "27017:27017"
    volumes:
      - mongo-data:/data/db
volumes:
  mongo-data:

Eine .env-Datei bietet Flexibilität und Komfort: Sie können dieselbe Datei mit dem Befehl docker run --env-file ... verwenden oder sie in Docker Compose für mehrere Services gemeinsam nutzen, ohne lange Abschnitte mit Umgebungsvariablen in Ihrer YAML-Konfiguration zu duplizieren.

Dieser Ansatz hält Umgebungsvariablen von der Hauptkonfigurationsdatei getrennt, was Übersicht und Sicherheit verbessert. Wenn Sie die .env-Datei nicht direkt im Stammverzeichnis ablegen, können Sie sensible Informationen besser verwalten. 

Das Attribut env_file unterstützt außerdem die Verwendung mehrerer .env-Dateien innerhalb einer Compose-Anwendung. Die im Attribut env_file angegebenen Pfade zu diesen .env-Dateien sind relativ zum Speicherort Ihrer Datei docker-compose.yml.

3. Docker-Umgebungsvariablen mit docker compose zur Laufzeit setzen

Mit Docker Compose können Sie Docker-Umgebungsvariablen über die Befehlszeile mit der Option --env-file setzen.

docker compose --env-file <environmental_variables_file> up

Fügen Sie nun die neue Beispiel-Umgebungsvariable zur .env-Datei hinzu.

MONGODB_PASSWORD=test

Starten Sie die Anwendung und lassen Sie sich die konfigurierten Docker-Umgebungsvariablen anzeigen.

4. Einmalige Docker-Umgebungsvariablen mit Docker Compose setzen

Wenn Sie mit docker compose run Umgebungsvariablen für einen einmaligen Container-Lauf setzen, können Sie diese Variablen mit den Optionen -e oder --env-file angeben. Dieser Ansatz ähnelt docker run und ermöglicht es Ihnen, Umgebungsvariablen nur für diese bestimmte Container-Instanz zu überschreiben oder zu setzen. 

Um beispielsweise die Variable DEBUG im Container Ihrer Webanwendung zu ändern, führen Sie Folgendes aus:

docker compose run -e DEBUG=0 web

Dieser Befehl setzt die Variable DEBUG für diesen Lauf gezielt im Service/Container web auf 0 und passt die Umgebung so an die unmittelbaren Anforderungen dieses Ausführungskontexts an.

Welche Best Practices gelten für das Setzen von Docker-Umgebungsvariablen?

Für das Setzen von Docker-Umgebungsvariablen gibt es mehrere Best Practices, die Sicherheit, Konsistenz und Wartbarkeit gewährleisten:

  • Verwenden Sie eine .env-Datei: Speichern Sie Umgebungsvariablen in einer separaten .env-Datei. Das hilft, Variablen für verschiedene Umgebungen (Entwicklung, Test, Produktion) zu organisieren. Stellen Sie sicher, dass die .env-Datei in .gitignore eingetragen ist, damit sensible Daten nicht in die Versionsverwaltung übernommen werden.
  • Verschlüsseln Sie sensible Daten: Speichern Sie sensible Informationen wie Passwörter und API-Schlüssel nicht direkt im Klartext. Verwenden Sie stattdessen Verschlüsselung, um sie sicher zu speichern. Entschlüsseln Sie diese Variablen bei Bedarf innerhalb der Anwendung.
  • Vermeiden Sie Änderungen zur Laufzeit: Ändern Sie Umgebungsvariablen nicht in einem laufenden Container. So stellen Sie Konsistenz über verschiedene Umgebungen hinweg sicher. Wenn Änderungen notwendig sind, stoppen Sie den Container, nehmen Sie die Änderungen vor und starten Sie eine neue Instanz.
  • Verwenden Sie einheitliche Namenskonventionen: Sorgen Sie für Konsistenz, indem Sie eine einheitliche Namenskonvention für Umgebungsvariablen verwenden. So lassen sie sich leichter verwalten und ihr Zweck ist leichter zu verstehen.
  • Regelmäßige Wartung: Überprüfen und aktualisieren Sie Docker-Umgebungsvariablen regelmäßig, damit sie aktuell und relevant bleiben. Entfernen oder aktualisieren Sie veraltete Variablen, um Übersicht und Effizienz zu erhalten.

Fazit

Diese Anleitung hat gezeigt, wie wichtig Docker-Umgebungsvariablen für ein konsistentes Anwendungsverhalten über verschiedene Plattformen hinweg sind. Wir haben erläutert, wie Sie diese Variablen in einem Dockerfile definieren und mit CLI-Befehlen und Docker Compose anpassen. Wenn Sie die Best Practices befolgen, können Sie sensible Daten sicher verwalten, mit Docker Compose konsistente Konfigurationen sicherstellen und die Effizienz Ihrer Deployments verbessern.

BlueVPS.com bietet leistungsstarke VPS-Lösungen mit Cloud-ähnlicher Verfügbarkeit und stellt eine einfache, skalierbare und anpassbare Umgebung bereit, die sich ideal für Docker-Deployments eignet. Profitieren Sie von dedizierten Ressourcen und unbegrenztem Traffic und optimieren Sie Ihre Docker-Anwendungen für robuste Leistung und nahtlose Skalierbarkeit.