Programy často řídí provoz prostřednictvím konfigurace dodávané se softwarem a proměnné prostředí umožňují uživatelům je nastavit za běhu. Spouštění procesů v kontejnerech Docker však věci komplikuje, jak tedy předáte proměnné prostředí do kontejneru?
K čemu slouží proměnné prostředí?
Proměnné prostředí umožňují oddělit konfiguraci od spustitelného souboru aplikace. Například byste nechtěli ukládat heslo své produkční databáze do své kódové báze – pokud ano, bylo by viditelné z Gitu a kdokoli s přístupem k vašemu kódu by vaši databázi mohl odstranit.
Místo toho ji nastavíte pomocí proměnné prostředí, která ukládá jednoduchý pár klíč–hodnota a umožňuje vám přístup k hodnotě v jakékoli aplikaci spuštěné ve stejné relaci prostředí (nejsou globálně dostupné). Výhodou je také možnost snadno definovat různé konfigurace pro různá prostředí. Například mít samostatné klíče pro vývojové a produkční databáze nebo používat jiný koncový bod API.
Nastavení těchto proměnných pro kontejnery Docker lze provést třemi hlavními způsoby – pomocí argumentů CLI, .env konfigurační soubory nebo prostřednictvím docker-compose .
S argumentem příkazového řádku
Příkaz používaný ke spouštění kontejnerů Docker, docker run , přijímá proměnné ENV jako argumenty. Jednoduše jej spusťte pomocí -e flag, zkratka pro --env a předejte pár klíč=hodnota:
sudo docker run -e POSTGRES_USER='postgres' -e POSTGRES_PASSWORD='password' ...
A pokud již máte tyto proměnné prostředí nastavené v prostředí, ve kterém je tento příkaz spuštěn, můžete je jednoduše předat přímo podle názvu:
// set variable POSTGRES_PASSWORD='password' // use it later docker run -e POSTGRES_PASSWORD -e POSTGRES_USER ...
Další zabezpečení pomocí souboru .env
Předávání proměnných s argumenty CLI funguje skvěle, ale má to nevýhodu – tyto proměnné jsou viditelné z hostitele. Jsou zaznamenány v historii příkazů a jsou viditelné v seznamu procesů pro spuštěný proces.
Linux má vestavěný způsob správy oprávnění pro toto – přístup k souborům. Uložení proměnných v .env file umožňuje řídit přístup k tomuto souboru pomocí oprávnění k souboru (chmod , chown ).
Vytvořte .env soubor s proměnnými v následujícím formátu, každou na novém řádku:
POSTGRES_PASSWORD='password' POSTGRES_USER='postgres' APPLICATION_URL='example.com'
Poté jej předejte docker run pomocí --env-file příznak:
docker run --env-file ./envfile ...
S Docker-Compose
Mnoho lidí samozřejmě nespouští kontejnery Docker přímo pomocí docker run a místo toho se rozhodnou použít docker-compose pro zpracování konfigurace více kontejnerů, které všechny představují jednu aplikaci.
Chcete-li předat proměnné prostředí do kontejneru spuštěného tímto způsobem, budete muset nakonfigurovat soubor pro vytvoření tak, aby předal proměnné relace do kontejneru Docker. Tato konfigurace zde předává POSTGRES_USER proměnnou pro sestavení i běhové prostředí a nastaví výchozí hodnotu, pokud neexistuje.
version: '3.1'
services:
my-service:
build:
context: .
args:
- POSTGRES_USER=${POSTGRES_USER:-default}
environment:
- POSTGRES_USER=${POSTGRES_USER:-default}
Před spuštěním docker-compose up budete muset nastavit proměnné prostředí , jinak k nim nebude mít přístup. Můžete je uložit do nového souboru, ale ten je obvykle sledován a verzován, což maří účel proměnných env.
S Kubernetes
Kubernetes je orchestrační systém, který zvládne provoz stovek kontejnerů v síti. Stále používá Docker, ale vždy se dotknete pouze konfigurace, takže přímé předávání proměnných prostředí nebude fungovat.
Místo toho je můžete definovat v konfiguraci pro Pod:
apiVersion: v1
kind: Pod
metadata:
name: example
spec:
containers:
- ...
env:
- name: SERVICE_PORT
value: "80"
- name: SERVICE_IP
value: "172.17.0.1" Kubernetes je komplikovaný a existuje mnoho různých způsobů, jak pracovat s proměnnými prostředí. Chcete-li se dozvědět více, můžete si přečíst jejich průvodce vkládáním dat do Podů.