GNU/Linux >> Znalost Linux >  >> Panels >> Docker

Využití proměnných prostředí sestavování dockeru

Pokud potřebujete definovat různé konfigurační hodnoty, proměnné prostředí jsou vaším nejlepším přítelem. Stejně jako mnoho dalších nástrojů, i Docker a konkrétněji Docker Compose mohou definovat a číst proměnné prostředí, které vám pomohou udržet vaše konfigurace čisté a modulární. Tento tutoriál vás naučí, jak používat docker-compose proměnné prostředí k definování různých kontejnerů, prostředí a dalších.

Předpoklady

Pokud chcete postupovat krok za krokem, ujistěte se, že máte následující:

  • Linuxový hostitel s oprávněními správce. Tento tutoriál používá Ubuntu 18.04.5 LTS.
  • Docker nainstalovaný na hostiteli Linux. Tento tutoriál používá Docker v19.03.11.

Deklarování proměnných prostředí v souboru Docker Compose

Kontejnery mohou vyžadovat mnoho konfigurace. A ne každá konfigurace ve vašich kontejnerech bude jedinečná. Některá nastavení mohou být sdílena mezi některými z vašich kontejnerů, například přihlašovací údaje k databázi MySQL. Uložte přihlašovací údaje ručně do každého kontejneru, a když se přihlašovací údaje změní, budete muset přihlašovací údaje aktualizovat několikrát.

Proměnné prostředí mohou tento problém snížit. Uložte tato sdílená nastavení jako proměnné prostředí! Místo toho, abyste se v kontejnerech opakovali, odkazujte na proměnné prostředí. Když se přihlašovací údaje změní, musíte aktualizovat pouze jedno nastavení:proměnnou prostředí.

Začněme deklarováním proměnné prostředí a jejím uložením do samotného souboru Docker Compose. Níže uvedené kroky uloží nastavení pro hypotetickou databázi MySQL do proměnných prostředí.

1. Otevřete terminál na místním počítači.

2. Vytvořte složku s názvem ~/docker-compose-demo, poté změňte (cd ) pracovní adresář do složky, kterou jste právě vytvořili. ~/docker-compose-demo složka bude obsahovat všechny soubory, které vytvoříte v tomto tutoriálu.

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

3. Otevřete svůj oblíbený textový editor, zkopírujte/vložte kód z úryvku níže v textovém editoru. Uložte soubor jako docker-compose.yml uvnitř ~/docker-compose-demo adresář. Soubor docker-compose.yml ukládá konfigurace služeb vaší aplikace.

Ve fragmentu kódu níže:

  • mysql:5.7 je základní obrázek, který Docker Compose stáhne a vytvoří nový kontejner.
  • MYSQL_ROOT_PASSWORD , MYSQL_ALLOW_EMPTY_PASSWORD a MYSQL_RANDOM_ROOT_PASSWORD jsou tři různé proměnné prostředí v souboru Docker Compose. Každá proměnná prostředí je deklarována se svými hodnotami. Hodnota, kterou proměnná prostředí získá, následuje za : symbol.
  • mysql služba vytvoří kontejner s názvem 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"

Některé kontejnery spoléhají na správné fungování proměnných prostředí. Ten v příkladu, MySQL, je jedním z těchto kontejnerů. Pokud nedeklarujete proměnné prostředí, které kontejner očekává, vyvolá chybu. Chybu můžete vidět níže.

4. Dále spusťte docker-compose up příkaz. docker-compose up příkaz přečte soubor YAML (docker-compose.yml ) vytvořený v předchozím kroku a vytvoří kontejner. docker-compose up příkaz spustí všechny služby nakonfigurované v souboru Docker Compose.

5. Nyní ověřte, zda jsou v kontejneru přítomny všechny tři proměnné prostředí, spuštěním docker exec a env příkaz.

Spuštění příkazu docker exec vám umožní přihlásit se ke kontejneru. Spuštění env vytiskne seznam aktuálních proměnných prostředí s jejich příslušnými hodnotami.

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

Nahrazení proměnných prostředí

V předchozí části jste se naučili, jak deklarovat proměnné prostředí přímo v souboru Docker Compose jejich pevným kódováním. Takový přístup není optimální, pokud potřebujete zabezpečit své přihlašovací údaje. Alternativně uložte hodnoty proměnných prostředí do souboru s názvem .env které může číst pouze správce.

Pojďme si procvičit použití substituce za proměnné prostředí. Ve vašem terminálu:

1. Vytvořte soubor s názvem .env ve stejném ~/docker-compose-demo a zkopírujte níže uvedený kód do .env soubor. Soubor bude mít všechny proměnné prostředí s jejich příslušnými hodnotami.

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

2. Dále upravte oprávnění souboru .env soubor, který jste vytvořili v předchozím kroku pomocí příkazu setfacl. Níže uvedený příkaz zajišťuje, že uživatel root má oprávnění ke čtení/zápisu do .env soubor.

  • m umožňuje nastavit oprávnění k souborům/složkám.
  • u je uživatel (root ), který bude mít oprávnění udělená zadanému souboru ~/*docker-compose-demo/.env
setfacl -m "u:root:rw" ~/docker-compose-demo/.env

3. Dále upravte a otevřete soubor docker-compose.yml pomocí svého oblíbeného editoru a komentujte sekci prostředí v docker-compose.yml z předchozí části. Přidejte níže uvedený kód a nastavte výchozí hodnoty pro proměnné prostředí v souboru Compose.

Docker nastavuje hodnoty pomocí příkazového řádku nebo čtením souborů, jako je .env soubor v příkladu. V obou případech Docker odpovídajícím způsobem nahradí hodnoty.

# 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} 

Kód definuje proměnné použitím metody řetězcové interpolace. Proměnné s řetězcovou interpolací jsou deklarovány jako ${variable}. Docker nastavuje hodnoty proměnných prostředí za běhu.

4. Znovu spusťte docker-compose up příkaz. Když spustíte docker-compose up příkaz docker-compose.yml soubor hledá hodnoty proměnných prostředí v .env soubor. docker-compose příkaz automaticky hledá .env soubor v adresáři projektu nebo v nadřazené složce vašeho nového souboru.

Jakmile docker-compose najde hodnotu pro proměnné prostředí nastavené v docker-compose.yml v .env soubor, Compose odpovídajícím způsobem nahradí hodnoty a spustí službu. Spuštěním služby se vytvoří kontejner definovaný v docker-compose.yml soubor.

Použití více souborů proměnných prostředí pro více prostředí

Doposud jste se naučili dva přístupy k deklaraci proměnných prostředí. Prvním z nich je deklarace proměnných prostředí v rámci docker-compose.yml soubor. Druhým přístupem je deklarování proměnných prostředí v rámci jednoho .env soubor a použití náhrady.

Oba přístupy jsou vhodné při práci s jedním prostředím. Pokud máte více prostředí, jako je produkce a/nebo testování, potřebujete jiný přístup. Pojďme se podívat, jak vytvořit více .env soubory s různými názvy, aby odpovídaly vašemu prostředí!

Níže uvedený příklad bude emulovat obvyklá prostředí, se kterými se můžete setkat v IT Ops:Dev, QA a Prod. Zpět na váš terminál:

1. Přejděte do svého ~/docker-compose-demo adresář a vytvořte soubor .env.dev soubor. Zkopírujte/vložte obsah kódu úryvku níže do souboru a uložte jej. Tento soubor bude obsahovat nastavení používaná pro vaši databázi vývojového prostředí MySQL.

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

2. Ve stejném adresáři vytvořte .env.qa a uložte obsah kódu úryvku níže do souboru. Toto jsou nastavení vaší databáze prostředí zabezpečení kvality MySQL.

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

3. Nyní vytvořte soubor .env.prod soubor pro uložení nastavení pro hypotetickou databázi produkčního prostředí MySQL. Obsah je níže:

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

4. Dále spusťte docker-compose pomocí --env-file možnost s uvedením .env.dev soubor. docker-compose příkaz hledá .env.dev soubor v aktuálním ~/docker-compose-demo adresář.

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

Předání souboru jako argumentu vám umožní uložit soubor kdekoli a pod vhodným názvem.

Jak můžete vidět níže, můžete snadno vybrat různé soubory prostředí a nasadit je nahrazením souboru .env.dev soubor do .env.qa nebo .env.prod soubor.

# 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. Nyní ověřte, zda konfigurační soubor (.env.dev ) byl úspěšně přečten spuštěním docker exec příkaz. Spuštění příkazu docker exec vám umožní přihlásit se ke kontejneru. Spuštění env vytiskne seznam aktuálních proměnných prostředí.

Všimněte si, že všechny tři proměnné prostředí (MYSQL_ROOT_PASSWORD , MYSQL_ALLOW_EMPTY_PASSWORD a MYSQL_RANDOM_ROOT_PASSWORD ) jsou přítomny v nádobě. Všimněte si, že jejich hodnoty pocházejí z env.dev soubor.

Začlenění env_file v Docker Compose File

V předchozí části jste viděli, jak deklarovat proměnné prostředí v .env soubory. Když uložíte hodnoty proměnných prostředí do souboru .env soubor samostatně, skončíte se spoustou řádků a odkazů v docker-compose.yml .

Chcete-li snížit odkazy a počet řádků pro proměnné prostředí v souboru docker-compose.yml zvažte začlenění env_file do docker-compose.yml soubor.

Pojďme se naučit, jak začlenit env_file v souboru Docker Compose. Ještě jednou v terminálu:

1. Vytvořte soubor s názvem var.env pro uložení nastavení vaší databáze MySQL. Zkopírujte/vložte následující do var.env soubor a uložte jej do stejného ~/docker-compose-demo adresář.

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

2. Dále otevřete dříve vytvořený soubor docker-compose.yml pomocí svého oblíbeného editoru. Nahraďte sekci prostředí z docker-compose.yml které jste dříve vytvořili pomocí env_file a přidejte cestu k souboru pomocí - ./var.env .

Docker nyní hledá ./var.env soubor ve stejném ~/docker-compose-demo adresář.

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

Všimněte si, že všechna tři nastavení a reference jsou nyní pryč. Zůstane vám jediná reference. V příkladu se to nemusí zdát moc. Ale v reálném světě se počet referencí může rychle vymknout kontrole.

3. Dále spusťte docker-compose příkaz. Příkaz hledá hodnoty proměnné prostředí přítomné v var.env a vytvoří kontejner, který jste definovali v docker-compose.yml soubor.

Docker vytváří služby, což znamená, že Docker našel hodnoty proměnných prostředí v var.env soubor. Pro potvrzení spusťte docker exec a env příkazy naposledy. Uvidíte všechny proměnné prostředí (MYSQL_ROOT_PASSWORD , MYSQL_ALLOW_EMPTY_PASSWORD a MYSQL_RANDOM_ROOT_PASSWORD ) a jejich hodnoty v kontejneru.

Závěr

V tomto kurzu jste se naučili různé způsoby deklarování proměnných prostředí pomocí Docker compose. Článek vám ukázal velkou flexibilitu, kterou Docker umožňuje při deklarování proměnných prostředí buď jejich přímým kódováním, nebo jejich použitím se samostatnými soubory.

Jaký přístup tedy použijete při spouštění kontejnerů Docker z Docker Compose?


Docker
  1. Rozdíl v použití mezi proměnnými shellu a proměnnými prostředí?

  2. Odkazování na proměnné prostředí *v* /etc/environment?

  3. Jak předávat proměnné prostředí do kontejnerů Docker

  1. Nastavení proměnných prostředí prostředí | BASH Shell

  2. Existuje způsob, jak změnit proměnné prostředí jiného procesu v Unixu?

  3. Nastavení proměnných prostředí Linuxu

  1. Jaký je nejlepší způsob nastavení proměnných prostředí podle distro/shell agnostického prostředí?

  2. Jsou proměnné mimo prostředí předány do podslupky vyvolány substitucí příkazů?

  3. Kontrola proměnných prostředí