Come passare le variabili di ambiente ai contenitori Docker

0
626

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 d'ambiente a un contenitore?

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 di produzione o utilizzare un diverso endpoint API.

L'impostazione di queste variabili per i contenitori Docker può essere eseguita in tre modi principali—con argomenti CLI, file di configurazione .env , o tramite docker-compose.

Con un argomento della riga di comando

Il comando utilizzato per avviare i contenitori Docker, docker run, accetta variabili ENV come argomenti. Basta eseguirlo con il flag -e, abbreviazione di –env, e passare la coppia chiave=valore:

sudo docker run -e POSTGRES_USER='postgres' -e POSTGRES_PASSWORD='password' .. .Pubblicità

E, se hai già quelle variabili d'ambiente impostate nell'ambiente che sta eseguendo quel comando, puoi semplicemente passarle direttamente per nome:

//set variabile POSTGRES_PASSWORD='password' //usalo in seguito 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 un aspetto negativo—quelle variabili sono visibili dall'host. Sono registrati nella cronologia dei comandi e sono visibili nell'elenco dei processi per il processo avviato.

Linux ha un modo integrato per gestire i permessi per questo—accesso ai file. La memorizzazione delle variabili in un file .env ti consente di controllare l'accesso a quel file con i permessi file (chmod, chown).

Crea un file .env con le variabili nel seguente formato, ciascuna su una nuova riga:

POSTGRES_PASSWORD='password' POSTGRES_USER='postgres' APPLICATION_URL='example.com'

Quindi, passalo a docker run con il flag –env-file:

docker run –env-file ./envfile …

Con Docker-Compose

Naturalmente, molte persone non avviano i container Docker direttamente con l'esecuzione di docker e scelgono invece di utilizzare un file docker-compose per gestire la configurazione di più container che rappresentano tutti una singola applicazione.

Per passare le variabili di ambiente a un contenitore lanciato in questo modo, dovrai configurare il file di composizione per passare le variabili della sessione attraverso il contenitore Docker. Questa configurazione qui passa la variabile POSTGRES_USER sia all'ambiente di compilazione che all'ambiente di runtime e imposta un valore predefinito se non esiste.

versione: '3.1' services: my-service: build: context: . args: – POSTGRES_USER=${POSTGRES_USER:-default} ambiente: – POSTGRES_USER=${POSTGRES_USER:-default} Advertisement

Dovrai impostare le variabili d'ambiente prima di eseguire docker-compose, altrimenti non lo farà potervi accedere. Potresti memorizzarli nel file di composizione, ma di solito è tracciato e con versione, il che vanifica lo scopo delle variabili env.

Con Kubernetes< /h2>

Kubernetes è un sistema di orchestrazione in grado di gestire l'esecuzione di centinaia di container in una rete. Utilizza ancora Docker, ma toccherai sempre e solo la configurazione, quindi il passaggio diretto delle variabili di ambiente non funzionerà.

Invece, puoi definirle nella configurazione per il Pod:

apiVersion : v1 tipo: metadati Pod: nome: esempio specifica: contenitori: – … env: – nome: valore SERVICE_PORT: “80” – nome: valore SERVICE_IP: “172.17.0.1”

Kubernetes è complicato e ci sono molti modi diversi di lavorare con le variabili di ambiente. Per saperne di più, puoi leggere le loro guide sull'iniezione di dati nei Pod.