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ů.