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

Nutzung der Docker-Compose-Umgebungsvariablen

Wenn Sie verschiedene Konfigurationswerte definieren müssen, sind Umgebungsvariablen Ihr bester Freund. Wie viele Tools können Docker und insbesondere Docker Compose Umgebungsvariablen definieren und lesen, um Ihre Konfigurationen sauber und modular zu halten. In diesem Tutorial lernen Sie, wie Sie docker-compose verwenden Umgebungsvariablen, um verschiedene Container, Umgebungen und mehr zu definieren.

Voraussetzungen

Wenn Sie Schritt für Schritt folgen möchten, stellen Sie sicher, dass Sie Folgendes haben:

  • Ein Linux-Host mit Administratorrechten. Dieses Tutorial verwendet Ubuntu 18.04.5 LTS.
  • Docker auf dem Linux-Host installiert. Dieses Tutorial verwendet Docker v19.03.11.

Umgebungsvariablen in der Docker Compose-Datei deklarieren

Container können viel Konfiguration erfordern. Und nicht jede Konfiguration in Ihren Containern ist einzigartig. Einige Einstellungen werden möglicherweise von einigen Ihrer Container gemeinsam genutzt, z. B. Anmeldeinformationen für die MySQL-Datenbank. Speichern Sie die Anmeldeinformationen manuell in jedem Container, und wenn sich die Anmeldeinformationen ändern, müssen Sie die Anmeldeinformationen schließlich mehrmals aktualisieren.

Umgebungsvariablen können diesen Aufwand reduzieren. Speichern Sie diese gemeinsamen Einstellungen als Umgebungsvariablen! Verweisen Sie auf die Umgebungsvariablen, anstatt sich in den Containern zu wiederholen. Wenn sich die Anmeldeinformationen ändern, müssen Sie nur eine Einstellung aktualisieren:die Umgebungsvariable.

Beginnen wir damit, eine Umgebungsvariable zu deklarieren und sie in der Docker Compose-Datei selbst zu speichern. Die folgenden Schritte speichern Einstellungen für eine hypothetische MySQL-Datenbank in Umgebungsvariablen.

1. Öffnen Sie ein Terminal auf Ihrem lokalen Rechner.

2. Erstellen Sie einen Ordner namens ~/docker-compose-demo, dann ändern (cd ) das Arbeitsverzeichnis in den Ordner, den Sie gerade erstellt haben. Die ~/docker-compose-demo Der Ordner enthält alle Dateien, die Sie in diesem Lernprogramm erstellen.

mkdir ~/docker-compose-demo
cd ~/docker-compose-demo

3. Öffnen Sie Ihren bevorzugten Texteditor, kopieren Sie den Code im folgenden Snippet und fügen Sie ihn in den Texteditor ein. Speichern Sie die Datei als docker-compose.yml innerhalb der ~/docker-compose-demo Verzeichnis. Die docker-compose.yml speichert die Konfigurationen für die Dienste Ihrer Anwendung.

Im Snippet-Code unten:

  • mysql:5.7 ist das Basis-Image, das Docker Compose abruft und einen neuen Container erstellt.
  • MYSQL_ROOT_PASSWORD , MYSQL_ALLOW_EMPTY_PASSWORD und MYSQL_RANDOM_ROOT_PASSWORD sind drei verschiedene Umgebungsvariablen in der Docker Compose-Datei. Jede Umgebungsvariable wird mit ihren Werten deklariert. Der Wert, den die Umgebungsvariable erhält, kommt nach : Symbol.
  • mysql Der Dienst erstellt den Container mit dem Namen mysql .
# Version of Docker compose file
version: "2.2"

services:
# Defining the service
  mysql:
# Defining the base image to be used 
    image: mysql:5.7
    hostname: mysql
    container_name: mysql
# Defining the environmental variable
    environment:
      # ENVIRONMET_VARIABLE_NAME: "environment variable value" 
      MYSQL_ROOT_PASSWORD: "root_password"
      MYSQL_ALLOW_EMPTY_PASSWORD: "password"
      MYSQL_RANDOM_ROOT_PASSWORD: "password"

Einige Container sind auf Umgebungsvariablen angewiesen, um ordnungsgemäß zu funktionieren. Der Container im Beispiel, MySQL, ist einer dieser Container. Wenn Sie die vom Container erwarteten Umgebungsvariablen nicht deklarieren, wird ein Fehler ausgegeben. Sie können den Fehler unten sehen.

4. Als nächstes führen Sie docker-compose up aus Befehl. Das docker-compose up liest die YAML-Datei (docker-compose.yml ), die im vorherigen Schritt erstellt wurde, und erstellt den Container. Das docker-compose up Der Befehl startet alle Dienste, die in der Docker Compose-Datei konfiguriert sind.

5. Überprüfen Sie nun, ob alle drei Umgebungsvariablen im Container vorhanden sind, indem Sie docker exec ausführen Befehl und den env Befehl.

Wenn Sie den Befehl docker exec ausführen, können Sie sich beim Container anmelden. Ausführen von env druckt die Liste der aktuellen Umgebungsvariablen mit ihren jeweiligen Werten.

# ee8a... is the container
docker exec -it ee8af8bfcd41 /bin/bash

Ersetzen der Umgebungsvariablen

Im vorherigen Abschnitt haben Sie gelernt, wie Sie die Umgebungsvariablen direkt in der Docker Compose-Datei deklarieren, indem Sie sie fest codieren. Ein solcher Ansatz ist nicht optimal, wenn Sie Ihre Anmeldeinformationen sichern müssen. Speichern Sie alternativ die Werte für Umgebungsvariablen in einer Datei namens .env die nur der Administrator lesen kann.

Lassen Sie uns die Verwendung der Substitution für Umgebungsvariablen üben. In Ihrem Terminal:

1. Erstellen Sie eine Datei namens .env in derselben ~/docker-compose-demo Verzeichnis und kopieren Sie den unten stehenden Code in die .env Datei. Die Datei enthält alle Umgebungsvariablen mit ihren jeweiligen Werten.

 # Defining the values of environmental variables
 MYSQL_ROOT_PASSWORD="root_password"
 MYSQL_ALLOW_EMPTY_PASSWORD="password"
 MYSQL_RANDOM_ROOT_PASSWORD="password"

2. Bearbeiten Sie als Nächstes die Berechtigungen der .env Datei, die Sie im vorherigen Schritt mit dem Befehl setfacl erstellt haben. Der folgende Befehl stellt sicher, dass der Root-Benutzer Lese-/Schreibberechtigungen für die .env hat Datei.

  • m Mit dem Parameter können Sie die Berechtigungen für die Dateien/Ordner festlegen.
  • u ist der Benutzer (root ), die Berechtigungen für die angegebene Datei ~/*docker-compose-demo/.env erhalten
setfacl -m "u:root:rw" ~/docker-compose-demo/.env

3. Bearbeiten Sie als Nächstes die Datei docker-compose.yml mit Ihrem bevorzugten Editor und kommentieren Sie den Umgebungsabschnitt in der docker-compose.yml aus aus dem vorherigen Abschnitt. Fügen Sie den folgenden Code hinzu, um Standardwerte für die Umgebungsvariablen in der Compose-Datei festzulegen.

Docker setzt die Werte über die Kommandozeile oder durch Auslesen von Dateien wie der .env Datei im Beispiel. In beiden Fällen ersetzt Docker die Werte entsprechend.

# Defining the environmental variable using Hardcoded values in variables
    environment:
	    ###  Static way ###
      # MYSQL_ROOT_PASSWORD: "root_password" 
			# MYSQL_ALLOW_EMPTY_PASSWORD: "password"
      # MYSQL_RANDOM_ROOT_PASSWORD: "password"

			### Substitution ### 
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} 
			MYSQL_ALLOW_EMPTY_PASSWORD: ${MYSQL_ALLOW_EMPTY_PASSWORD} 
			MYSQL_RANDOM_ROOT_PASSWORD:  ${MYSQL_RANDOM_ROOT_PASSWORD} 

Der Code definiert die Variablen durch Anwendung der String-Interpolationsmethode. Variablen mit String-Interpolation werden als ${Variable} deklariert. Docker setzt die Werte der Umgebungsvariablen zur Laufzeit.

4. Führen Sie erneut docker-compose up aus Befehl. Wenn Sie docker-compose up ausführen Befehl, die docker-compose.yml Datei sucht nach den Werten der Umgebungsvariablen in der .env Datei. Die docker-compose Der Befehl sucht automatisch nach einer .env Datei im Projektverzeichnis oder im übergeordneten Ordner Ihrer Erstellungsdatei.

Sobald docker-compose findet den Wert für die in docker-compose.yml festgelegten Umgebungsvariablen in der .env -Datei ersetzt Compose die Werte entsprechend und startet den Dienst. Das Starten des Dienstes erstellt den Container, der in docker-compose.yml definiert ist Datei.

Mehrere Umgebungsvariablendateien für mehrere Umgebungen verwenden

Bisher haben Sie zwei Ansätze kennengelernt, um die Umgebungsvariablen zu deklarieren. Die erste besteht darin, Umgebungsvariablen innerhalb der docker-compose.yml zu deklarieren Datei. Der zweite Ansatz besteht darin, die Umgebungsvariablen innerhalb einer einzigen .env zu deklarieren Datei und Anwenden der Ersetzung.

Beide Ansätze eignen sich für die Arbeit mit einer einzigen Umgebung. Wenn Sie mehrere Umgebungen haben, z. B. Produktion und/oder Test, benötigen Sie einen anderen Ansatz. Schauen wir uns an, wie man mehrere .env erstellt Dateien mit unterschiedlichen Namen, um sie an Ihre Umgebung anzupassen!

Das folgende Beispiel emuliert die üblichen Umgebungen, auf die man in IT-Operationen stoßen könnte:Dev, QA und Prod. Zurück auf Ihrem Terminal:

1. Navigieren Sie zu Ihrer ~/docker-compose-demo Verzeichnis und erstellen Sie eine .env.dev Datei. Kopieren Sie den Inhalt des Snippet-Codes unten in die Datei und speichern Sie ihn. Diese Datei enthält die Einstellungen, die für die Datenbank Ihrer MySQL-Entwicklungsumgebung verwendet werden.

# Enviornmental Variables file .env.dev
MYSQL_ROOT_PASSWORD="password_DEV"
MYSQL_ALLOW_EMPTY_PASSWORD="password1"
MYSQL_RANDOM_ROOT_PASSWORD="password1"

2. Erstellen Sie im selben Verzeichnis eine .env.qa Datei und speichern Sie den Inhalt des Codeausschnitts unten in der Datei. Dies sind die Einstellungen für die Datenbank Ihrer MySQL-Qualitätssicherungsumgebung.

# Enviornmental Variables  file .env.qa
MYSQL_ROOT_PASSWORD="password_QA"
MYSQL_ALLOW_EMPTY_PASSWORD="password2"
MYSQL_RANDOM_ROOT_PASSWORD="password2"

3. Erstellen Sie nun eine .env.prod Datei zum Speichern der Einstellungen für die hypothetische Datenbank der MySQL-Produktionsumgebung. Der Inhalt ist unten:

# Enviornmental Variables file .env.prod
MYSQL_ROOT_PASSWORD="password_PROD"
MYSQL_ALLOW_EMPTY_PASSWORD="password3"
MYSQL_RANDOM_ROOT_PASSWORD="password3"

4. Als nächstes führen Sie docker-compose aus Befehl mit dem --env-file Option, die .env.dev angibt Datei. Die docker-compose sucht nach .env.dev Datei in der aktuellen ~/docker-compose-demo Verzeichnis.

docker-compose --env-file .env.dev up

Wenn Sie die Datei als Argument übergeben, können Sie die Datei überall und unter einem geeigneten Namen speichern.

Wie Sie unten sehen können, können Sie die verschiedenen Umgebungsdateien einfach auswählen und bereitstellen, indem Sie .env.dev ersetzen Datei entweder in die .env.qa oder die .env.prod Datei.

# Running the docker-compose command with the QA file
docker-compose --env-file .env.qa up
# Running the docker-compose command with the Prod file
docker-compose --env-file .env.prod up

5. Überprüfen Sie nun, ob die Konfigurationsdatei (.env.dev ) wurde erfolgreich gelesen, indem docker exec ausgeführt wurde Befehl. Wenn Sie den Befehl docker exec ausführen, können Sie sich beim Container anmelden. Ausführen von env druckt die Liste der aktuellen Umgebungsvariablen.

Beachten Sie, dass alle drei Umgebungsvariablen (MYSQL_ROOT_PASSWORD , MYSQL_ALLOW_EMPTY_PASSWORD und MYSQL_RANDOM_ROOT_PASSWORD ) sind im Behälter vorhanden. Beachten Sie, dass ihre Werte aus env.dev stammen Datei.

Einbindung der env_file in der Docker-Compose-Datei

Im vorherigen Abschnitt haben Sie gesehen, wie die Umgebungsvariablen in .env deklariert werden Dateien. Wenn Sie Umgebungsvariablenwerte in der Datei .env speichern Datei getrennt, erhalten Sie am Ende viele Zeilen und Verweise in der docker-compose.yml .

Um die Referenzen und die Anzahl der Zeilen für Umgebungsvariablen in der docker-compose.yml zu reduzieren Datei, ziehen Sie in Betracht, die env_file in Ihre docker-compose.yml einzubinden Datei.

Lassen Sie uns lernen, wie man die env_file einbindet in der Docker-Compose-Datei. Nochmals im Terminal:

1. Erstellen Sie eine Datei namens var.env um die Einstellungen für Ihre MySQL-Datenbank zu speichern. Kopieren Sie Folgendes und fügen Sie es in die var.env ein -Datei und speichern Sie sie unter demselben ~/docker-compose-demo Verzeichnis.

MYSQL_ROOT_PASSWORD="password_NEW"
MYSQL_ALLOW_EMPTY_PASSWORD="password_NEW"
MYSQL_RANDOM_ROOT_PASSWORD="password_NEW"

2. Öffnen Sie als Nächstes die zuvor erstellte Datei docker-compose.yml mit Ihrem bevorzugten Editor. Ersetzen Sie den Umgebungsabschnitt aus docker-compose.yml die Sie zuvor mit env_file erstellt haben , und fügen Sie den Pfad der Datei mit - ./var.env hinzu .

Docker sucht nun nach ./var.env Datei in derselben ~/docker-compose-demo Verzeichnis.

version: "2.2"

services:
  mysql_svc:
    image: mysql:5.7
    hostname: mysql
    container_name: mysql
# Replacing the environment: with env_file: 
  # environment:
  #   MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
  #   MYSQL_ALLOW_EMPTY_PASSWORD: ${MYSQL_ALLOW_EMPTY_PASSWORD}
  #   MYSQL_RANDOM_ROOT_PASSWORD: ${MYSQL_RANDOM_ROOT_PASSWORD}
    env_file:
     - ./var.env

Beachten Sie, dass alle drei Einstellungen und Referenzen jetzt weg sind. Sie haben nur noch eine einzige Referenz. Im Beispiel mag das nicht viel erscheinen. Aber in der realen Welt kann die Anzahl der Referenzen sehr schnell aus dem Ruder laufen.

3. Als nächstes führen Sie docker-compose aus Befehl. Der Befehl sucht nach den Werten der Umgebungsvariablen, die in var.env vorhanden sind -Datei und erstellt den Container, den Sie in der docker-compose.yml definiert haben Datei.

Docker erstellt die Dienste, was bedeutet, dass Docker die Werte für die Umgebungsvariablen in var.env gefunden hat Datei. Führen Sie zur Bestätigung docker exec aus und die env befiehlt ein letztes Mal. Sie sehen alle Umgebungsvariablen (MYSQL_ROOT_PASSWORD , MYSQL_ALLOW_EMPTY_PASSWORD und MYSQL_RANDOM_ROOT_PASSWORD ) und ihre Werte im Container.

Schlussfolgerung

In diesem Tutorial haben Sie verschiedene Möglichkeiten zum Deklarieren von Umgebungsvariablen mit Docker compose kennengelernt. Der Artikel hat Ihnen die große Flexibilität gezeigt, die Docker beim Deklarieren der Umgebungsvariablen zulässt, indem Sie sie entweder direkt codieren oder mit separaten Dateien verwenden.

Welchen Ansatz werden Sie also als Nächstes verwenden, wenn Sie Ihre Docker-Container von Docker Compose aus ausführen?


Docker
  1. Der Unterschied in der Verwendung zwischen Shell-Variablen und Umgebungsvariablen?

  2. Umgebungsvariablen *in* /etc/environment referenzieren?

  3. So übergeben Sie Umgebungsvariablen an Docker-Container

  4. Auf Umgebungsvariablen prüfen

  5. Legen Sie eine temporäre Umgebung fest ($PATH)

So setzen Sie Umgebungsvariablen in Linux

Jenkins-Umgebungsvariablen:Ultimativer Leitfaden

So legen Sie die Umgebungsvariable in Windows fest

So legen Sie Umgebungsvariablen in MacOS fest

Ubuntu-Varianten:Was ist der Unterschied?

Linux-Umgebungsvariablen