GNU/Linux >> Linux Esercitazione >  >> Panels >> Docker

Come passare le variabili d'ambiente ai container Docker

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

A cosa servono le variabili d'ambiente?

Le variabili di ambiente consentono di disaccoppiare la configurazione dall'eseguibile dell'applicazione. Ad esempio, non vorresti 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 della shell (non sono accessibili a livello globale). Questo ha anche il vantaggio di poter definire facilmente diverse configurazioni per ambienti diversi. 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, .env config o tramite docker-compose .

Con un argomento a riga di comando

Il comando utilizzato per avviare i contenitori Docker, docker run , accetta variabili ENV come argomenti. Basta eseguirlo con -e flag, abbreviazione di --env e passa 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:

// set variable
POSTGRES_PASSWORD='password'

// use it later
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 sono visibili nell'elenco dei processi per il processo avviato.

Linux ha un modo integrato per gestire le autorizzazioni per questo:l'accesso ai file. Memorizzazione delle variabili in un .env file ti consente di controllare l'accesso a quel file con i permessi del 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='example.com'

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

docker run --env-file ./envfile ...

Con Docker-Compose

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

Per passare le variabili di ambiente a un contenitore avviato in questo modo, dovrai configurare il file di composizione in modo che passi le variabili della sessione al contenitore Docker. Questa configurazione qui passa il POSTGRES_USER sia per l'ambiente di compilazione che per l'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 potrà accedervi. Potresti archiviarli nel file di composizione, ma di solito viene monitorato e sottoposto a versionamento, il che vanifica lo scopo delle variabili env.

Con Kubernetes

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

Puoi invece definirli nella configurazione del 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 è complicato e ci sono molti modi diversi per lavorare con le variabili d'ambiente. Per saperne di più, puoi leggere le loro guide sull'inserimento dei dati nei Pod.


Docker
  1. Come aggiornare automaticamente i contenitori Docker in esecuzione

  2. Come esportare e importare contenitori Docker

  3. Come usare Docker Compose

  4. Come collegare i contenitori Docker

  5. Come rimuovere tutti i contenitori Docker

Come eseguire i contenitori Docker

Come rimuovere i contenitori Docker

Come fermare i container Docker

Come rinominare o rinominare i contenitori Docker

Come gestire i container Docker

Come configurare gli spazi dei nomi di rete nei contenitori Docker