Le variabili d'ambiente consentono di separare la configurazione dall'eseguibile dell'applicazione. Ad esempio, non vorrai memorizzare la password del database di produzione nella tua codebase: se lo facessi, sarebbe visibile da Git e chiunque abbia accesso al tuo codice potrebbe rimuovere il tuo database.
Invece, lo imposti con una variabile di ambiente, che memorizza una semplice coppia chiave-valore e ti consente di accedere al valore in qualsiasi applicazione in esecuzione nella stessa sessione di shell (non sono accessibili a livello globale). Questo ha anche il vantaggio di poter definire facilmente diverse configurazioni per diversi ambienti. Ad esempio, avere chiavi separate per i database di sviluppo e produzione o utilizzare un endpoint API diverso.
L'impostazione di queste variabili per i contenitori Docker può essere eseguita in tre modi principali: con argomenti CLI, .envfile di configurazione o tramite docker-compose.
Il comando utilizzato per avviare i contenitori Docker docker run, accetta variabili ENV come argomenti. Basta eseguirlo con il -e flag, l'abbreviazione di --env, e passare la coppia chiave=valore:
sudo docker run \
-e POSTGRES_USER='postgres' \
-e POSTGRES_PASSWORD='password' \
...
E, se hai già quelle variabili di ambiente impostate nell'ambiente che sta eseguendo quel comando, puoi semplicemente passarle direttamente per nome:
//impostazione della variabile
POSTGRES_PASSWORD='password'
//utilizzo
docker run -e POSTGRES_PASSWORD -e POSTGRES_USER ...
Sicurezza aggiuntiva con un file .env
Il passaggio di variabili con argomenti CLI funziona alla grande, ma ha uno svantaggio: quelle variabili sono visibili dall'host. Sono registrati nella cronologia dei comandi e visibili nell'elenco dei processi per il processo avviato.
Linux ha un modo integrato per gestire le autorizzazioni per questo: l'accesso ai file. La memorizzazione delle variabili in un .envfile consente di controllare l'accesso a quel file con i permessi file ( chmod, chown).
Crea un .env file con variabili nel seguente formato, ciascuna su una nuova riga:
POSTGRES_PASSWORD='password'
POSTGRES_USER='postgres'
APPLICATION_URL='esempio.com'
Quindi, passalo a docker run
con il flag --env-file
:
docker run --env-file ./envfile ...
Naturalmente, molte persone non avviano i contenitori Docker direttamente con docker run, e scelgono invece di utilizzare un docker-compose file per gestire la configurazione di più contenitori che rappresentano tutti una singola applicazione.
Per passare le variabili di ambiente a un contenitore avviato in questo modo, dovrai configurare il file di composizione per passare le variabili della sessione attraverso il contenitore Docker. Questa configurazione passa la POSTGRES_USER variabile sia all'ambiente di compilazione che all'ambiente di runtime e imposta un valore predefinito se non esiste.
version: '3.1'
services:
my-service:
build:
context: .
args:
- POSTGRES_USER=${POSTGRES_USER:-default}
environment:
- POSTGRES_USER=${POSTGRES_USER:-default}
Dovrai impostare le variabili di ambiente prima di eseguire docker-compose up, altrimenti non sarà in grado di accedervi. Potresti memorizzarli nel file di composizione, ma di solito è tracciato e con versione, il che vanifica lo scopo delle variabili env.