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

Sfruttare le variabili d'ambiente di composizione mobile

Se devi definire vari valori di configurazione, le variabili di ambiente sono le tue migliori alleate. Come molti strumenti, Docker e, più specificamente, Docker Compose possono definire e leggere variabili di ambiente per mantenere le configurazioni pulite e modulari. Questo tutorial ti insegna come usare docker-compose variabili di ambiente per definire diversi contenitori, ambienti e altro.

Prerequisiti

Se desideri seguire passo dopo passo, assicurati di avere quanto segue:

  • Un host Linux con privilegi di amministratore. Questo tutorial utilizza Ubuntu 18.04.5 LTS.
  • Docker installato sull'host Linux. Questo tutorial utilizza Docker v19.03.11.

Dichiarazione delle variabili d'ambiente nel file Docker Compose

I container possono richiedere molta configurazione. E non tutte le configurazioni nei tuoi container saranno uniche. Alcune impostazioni potrebbero essere condivise su alcuni dei tuoi contenitori, come le credenziali di un database MySQL. Archivia le credenziali manualmente in ogni contenitore e, quando le credenziali cambiano, finisci per dover aggiornare le credenziali più volte.

Le variabili d'ambiente possono ridurre questa seccatura. Memorizza quelle impostazioni condivise come variabili d'ambiente! Fare riferimento alle variabili di ambiente invece di ripetere te stesso nei contenitori. Quando le credenziali cambiano, devi aggiornare solo un'impostazione:la variabile di ambiente.

Iniziamo dichiarando una variabile di ambiente e memorizzandola nel file Docker Compose stesso. I passaggi seguenti memorizzeranno le impostazioni per un ipotetico database MySQL nelle variabili di ambiente.

1. Apri un terminale sul tuo computer locale.

2. Crea una cartella denominata ~/docker-compose-demo, quindi cambia (cd ) la directory di lavoro nella cartella appena creata. La demo ~/docker-compose-demo cartella conterrà tutti i file che creerai in questo tutorial.

mkdir ~/docker-compose-demo
cd ~/docker-compose-demo

3. Apri il tuo editor di testo preferito, copia/incolla il codice nello snippet sottostante nell'editor di testo. Salva il file come docker-compose.yml all'interno della ~/docker-compose-demo directory. Il docker-compose.yml memorizza le configurazioni per i servizi della tua applicazione.

Nel codice snippet di seguito:

  • mysql:5.7 è l'immagine di base che Docker Compose estrae e crea un nuovo contenitore.
  • MYSQL_ROOT_PASSWORD , MYSQL_ALLOW_EMPTY_PASSWORD e MYSQL_RANDOM_ROOT_PASSWORD sono tre diverse variabili di ambiente all'interno del file Docker Compose. Ogni variabile di ambiente viene dichiarata con i suoi valori. Il valore che ottiene la variabile di ambiente viene dopo il : simbolo.
  • mysql il servizio creerà il contenitore denominato mysql .
# Version of Docker compose file
version: "2.2"

services:
# Defining the service
  mysql:
# Defining the base image to be used 
    image: mysql:5.7
    hostname: mysql
    container_name: mysql
# Defining the environmental variable
    environment:
      # ENVIRONMET_VARIABLE_NAME: "environment variable value" 
      MYSQL_ROOT_PASSWORD: "root_password"
      MYSQL_ALLOW_EMPTY_PASSWORD: "password"
      MYSQL_RANDOM_ROOT_PASSWORD: "password"

Alcuni contenitori si basano su variabili di ambiente per funzionare correttamente. Quello nell'esempio, MySQL, è uno di questi contenitori. Se non dichiari le variabili di ambiente che il contenitore si aspetta, genererà un errore. Puoi vedere l'errore di seguito.

4. Quindi, esegui docker-compose up comando. La docker-compose up il comando legge il file YAML (docker-compose.yml ) creato nel passaggio precedente e crea il contenitore. La docker-compose up il comando avvia tutti i servizi configurati nel file Docker Compose.

5. Ora verifica se tutte e tre le variabili di ambiente sono presenti nel contenitore eseguendo docker exec comando e il env comando.

L'esecuzione del comando docker exec ti consentirà di accedere al contenitore. Esecuzione di env stamperà l'elenco delle variabili d'ambiente correnti con i rispettivi valori.

# ee8a... is the container
docker exec -it ee8af8bfcd41 /bin/bash

Sostituzione delle variabili d'ambiente

Nella sezione precedente, hai appreso come dichiarare le variabili di ambiente direttamente all'interno del file Docker Compose codificandole. Un tale approccio non è ottimale se è necessario proteggere le proprie credenziali. In alternativa, archivia i valori per le variabili di ambiente in un file denominato .env che solo l'amministratore può leggere.

Facciamo pratica usando la sostituzione per le variabili d'ambiente. Nel tuo terminale:

1. Crea un file denominato .env nella stessa ~/docker-compose-demo directory e copia il codice qui sotto nel .env file. Il file conterrà tutte le variabili di ambiente con i rispettivi valori.

 # Defining the values of environmental variables
 MYSQL_ROOT_PASSWORD="root_password"
 MYSQL_ALLOW_EMPTY_PASSWORD="password"
 MYSQL_RANDOM_ROOT_PASSWORD="password"

2. Quindi, modifica le autorizzazioni di .env file creato nel passaggio precedente utilizzando il comando setfacl. Il comando seguente garantisce che l'utente root disponga dei permessi di lettura/scrittura su .env file.

  • m parametro consente di impostare i permessi per i file/cartelle.
  • u è l'utente (root ) che avrà le autorizzazioni concesse al file specificato ~/*docker-compose-demo/.env
setfacl -m "u:root:rw" ~/docker-compose-demo/.env

3. Quindi, modifica e apri il file docker-compose.yml con il tuo editor preferito e commenta la sezione dell'ambiente in docker-compose.yml dalla sezione precedente. Aggiungi il codice seguente per impostare i valori predefiniti per le variabili di ambiente nel file Compose.

Docker imposta i valori tramite la riga di comando o leggendo file, come .env file nell'esempio. In entrambi i casi, Docker sostituisce i valori di conseguenza.

# Defining the environmental variable using Hardcoded values in variables
    environment:
	    ###  Static way ###
      # MYSQL_ROOT_PASSWORD: "root_password" 
			# MYSQL_ALLOW_EMPTY_PASSWORD: "password"
      # MYSQL_RANDOM_ROOT_PASSWORD: "password"

			### Substitution ### 
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} 
			MYSQL_ALLOW_EMPTY_PASSWORD: ${MYSQL_ALLOW_EMPTY_PASSWORD} 
			MYSQL_RANDOM_ROOT_PASSWORD:  ${MYSQL_RANDOM_ROOT_PASSWORD} 

Il codice definisce le variabili applicando il metodo di interpolazione delle stringhe. Le variabili con interpolazione di stringhe sono dichiarate come ${variable}. Docker imposta i valori delle variabili di ambiente in fase di esecuzione.

4. Di nuovo, esegui docker-compose up comando. Quando esegui docker-compose up comando, il docker-compose.yml il file cerca i valori delle variabili di ambiente in .env file. La docker-compose comando cerca automaticamente un .env file nella directory del progetto o nella cartella principale del file di composizione.

Non appena docker-compose trova il valore per le variabili di ambiente impostate in docker-compose.yml nel .env file, Compose sostituisce i valori di conseguenza e avvia il servizio. L'avvio del servizio crea il contenitore definito in docker-compose.yml file.

Utilizzo di più file di variabili di ambiente per più ambienti

Finora, hai imparato due approcci per dichiarare le variabili d'ambiente. Il primo consiste nel dichiarare le variabili di ambiente all'interno di docker-compose.yml file. Il secondo approccio consiste nel dichiarare le variabili di ambiente all'interno di un singolo .env file e applicando la sostituzione.

Entrambi gli approcci sono adatti quando si lavora con un unico ambiente. Se hai più ambienti, come Produzione e/o Test, hai bisogno di un approccio diverso. Diamo un'occhiata a come creare più .env file con nomi diversi da abbinare ai tuoi ambienti!

L'esempio seguente emulerà i normali ambienti che si potrebbero incontrare nelle operazioni IT:Dev, QA e Prod. Torna sul tuo terminale:

1. Vai al tuo ~/docker-compose-demo directory e creare un file .env.dev file. Copia/incolla il contenuto del codice snippet di seguito nel file e salvalo. Questo file conterrà le impostazioni utilizzate per il database dell'ambiente di sviluppo MySQL.

# Enviornmental Variables file .env.dev
MYSQL_ROOT_PASSWORD="password_DEV"
MYSQL_ALLOW_EMPTY_PASSWORD="password1"
MYSQL_RANDOM_ROOT_PASSWORD="password1"

2. Nella stessa directory, creare un .env.qa file e salva il contenuto del codice snippet di seguito nel file. Queste sono le impostazioni per il database dell'ambiente di garanzia della qualità MySQL.

# Enviornmental Variables  file .env.qa
MYSQL_ROOT_PASSWORD="password_QA"
MYSQL_ALLOW_EMPTY_PASSWORD="password2"
MYSQL_RANDOM_ROOT_PASSWORD="password2"

3. Ora crea un .env.prod per memorizzare le impostazioni per l'ipotetico database dell'ambiente di produzione MySQL. I contenuti sono di seguito:

# Enviornmental Variables file .env.prod
MYSQL_ROOT_PASSWORD="password_PROD"
MYSQL_ALLOW_EMPTY_PASSWORD="password3"
MYSQL_RANDOM_ROOT_PASSWORD="password3"

4. Quindi, esegui docker-compose comando con il --env-file opzione, specificando .env.dev file. La docker-compose il comando cerca .env.dev nel file ~/docker-compose-demo corrente directory.

docker-compose --env-file .env.dev up

Il passaggio del file come argomento consente di archiviare il file ovunque e con un nome appropriato.

Come puoi vedere di seguito, puoi facilmente selezionare i diversi file di ambiente e distribuirli sostituendo .env.dev file in .env.qa o il .env.prod file.

# Running the docker-compose command with the QA file
docker-compose --env-file .env.qa up
# Running the docker-compose command with the Prod file
docker-compose --env-file .env.prod up

5. Ora verifica se il file di configurazione (.env.dev ) è stato letto correttamente eseguendo docker exec comando. L'esecuzione del comando docker exec ti consentirà di accedere al contenitore. Esecuzione di env stamperà l'elenco delle variabili di ambiente correnti.

Si noti che tutte e tre le variabili di ambiente (MYSQL_ROOT_PASSWORD , MYSQL_ALLOW_EMPTY_PASSWORD e MYSQL_RANDOM_ROOT_PASSWORD ) sono presenti nel contenitore. Nota che i loro valori provengono da env.dev file.

Incorporando il env_file nel File di composizione Docker

Nella sezione precedente, hai visto come dichiarare le variabili di ambiente in .env File. Quando memorizzi i valori delle variabili di ambiente in .env file separatamente, ti ritroverai con molte righe e riferimenti nella docker-compose.yml .

Per ridurre i riferimenti e il numero di righe per le variabili di ambiente in docker-compose.yml file, considera la possibilità di incorporare env_file nel tuo docker-compose.yml file.

Impariamo come incorporare il env_file nel file di composizione Docker. Ancora una volta, nel terminale:

1. Crea un file chiamato var.env per mantenere le impostazioni per il tuo database MySQL. Copia/incolla quanto segue in var.env file e salvalo nello stesso ~/docker-compose-demo directory.

MYSQL_ROOT_PASSWORD="password_NEW"
MYSQL_ALLOW_EMPTY_PASSWORD="password_NEW"
MYSQL_RANDOM_ROOT_PASSWORD="password_NEW"

2. Quindi, apri il file docker-compose.yml creato in precedenza usando il tuo editor preferito. Sostituisci la sezione dell'ambiente da docker-compose.yml che hai creato in precedenza con env_file e aggiungi il percorso del file con - ./var.env .

Docker ora cerca ./var.env nello stesso ~/docker-compose-demo directory.

version: "2.2"

services:
  mysql_svc:
    image: mysql:5.7
    hostname: mysql
    container_name: mysql
# Replacing the environment: with env_file: 
  # environment:
  #   MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
  #   MYSQL_ALLOW_EMPTY_PASSWORD: ${MYSQL_ALLOW_EMPTY_PASSWORD}
  #   MYSQL_RANDOM_ROOT_PASSWORD: ${MYSQL_RANDOM_ROOT_PASSWORD}
    env_file:
     - ./var.env

Si noti che tutte e tre le impostazioni e i riferimenti ora sono scomparsi. Ti rimane un unico riferimento. Potrebbe non sembrare molto nell'esempio. Ma nel mondo reale, il numero di referenze può sfuggire di mano molto rapidamente.

3. Quindi, esegui docker-compose comando. Il comando cerca i valori della variabile d'ambiente presente nella var.env e crea il contenitore che hai definito in docker-compose.yml file.

Docker crea i servizi, il che significa che Docker ha trovato i valori per le variabili di ambiente in var.env file. Per confermare, esegui docker exec e il env comanda un'ultima volta. Vedrai tutte le variabili d'ambiente (MYSQL_ROOT_PASSWORD , MYSQL_ALLOW_EMPTY_PASSWORD e MYSQL_RANDOM_ROOT_PASSWORD ) e i relativi valori nel contenitore.

Conclusione

In questo tutorial, hai appreso diversi modi per dichiarare le variabili di ambiente con Docker Compose. L'articolo ha mostrato la grande flessibilità che Docker consente nella dichiarazione delle variabili d'ambiente codificandole direttamente o utilizzandole con file separati.

Quindi quale approccio utilizzerai in seguito durante l'esecuzione dei tuoi contenitori Docker da Docker Compose?


Docker
  1. Impostazione delle variabili d'ambiente della shell | BASH Shell

  2. C'è un modo per cambiare le variabili d'ambiente di un altro processo in Unix?

  3. Come si danno su le variabili di ambiente dell'utente corrente

  4. Imposta un ambiente temporaneo ($PATH)

  5. Come annullare l'impostazione di molte variabili d'ambiente

Come impostare le variabili d'ambiente in Linux

Variabili d'ambiente Jenkins:guida definitiva

Come impostare la variabile d'ambiente in Windows

Come impostare le variabili d'ambiente in MacOS

Sapori di Ubuntu:qual è la differenza?

Variabili d'ambiente Linux