saverioriotto.it

Passaggio delle variabili di ambiente ai contenitori Docker

I programmi spesso controllano il funzionamento tramite la configurazione in bundle con il software e le variabili di ambiente consentono agli utenti di impostarli in fase di esecuzione. Tuttavia, l'esecuzione di processi nei contenitori Docker complica le cose, quindi come si passano le variabili di ambiente a un contenitore?

Passaggio delle variabili di ambiente ai contenitori Docker

A cosa servono le variabili d'ambiente?

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.

Passaggio variabili tramite riga di comando

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

Passaggio variabili con Docker-Compose

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.




Commenti
* Obbligatorio