Post Image

Gestione delle Variabili di Ambiente in Docker Compose

La gestione delle variabili di ambiente è una pratica essenziale nello sviluppo software moderno, in particolare quando si utilizzano container Docker.

Utilizzare Docker Compose, per configurare dinamicamente i servizi e le risorse delle applicazioni, permette di gestire ambienti di sviluppo, test e produzione in modo flessibile ed efficiente.

In questo articolo, vedremo come creare e gestire un file .env e come integrarlo correttamente con il file docker-compose.yml.

Creazione del File .env

Il file .env è un semplice file di testo (nascosto) che contiene variabili di ambiente definite nel formato NOMEVARIABILE=valore. Assicurati sempre che il file .env non contenga spazi attorno agli =. Queste variabili possono essere utilizzate per configurare diversi aspetti dei servizi Docker.

Per creare un file .env, segui i seguenti punti:

  1. Creare il file .env nella radice del progetto:

    touch .env
    
  2. Definire le variabili di ambiente nel file .env:

    DATA_BASEDIR=/percorso/del/tuo/volume
    HTTP_PORT=80
    HTTPS_PORT=443
    

    In questo esempio, DATA_BASEDIR specifica il percorso del volume, mentre HTTP_PORT e HTTPS_PORT definiscono le porte HTTP e HTTPS.

Utilizzo delle Variabili di Ambiente in docker-compose.yml

Una volta definite le variabili di ambiente nel file .env, possiamo utilizzarle nel file docker-compose.yml con la sintassi ${NOME_VARIABILE}.

Ecco un esempio:

services:
  nome_servizio:
    build: .
    restart: unless-stopped
    container_name: nome_servizio
    network_mode: bridge
    volumes:
      - ${DATA_BASEDIR}:/var/data
    ports:
      - "${HTTP_PORT}:8080"
      - "${HTTPS_PORT}:8443"

In questo file docker-compose.yml:

  • Le variabili ${DATA_BASEDIR}, ${HTTP_PORT}, e ${HTTPS_PORT} sono utilizzate per configurare il volume e le porte del servizio nome_servizio.
  • Le porte sono racchiuse tra doppi apici per evitare problemi di sintassi YAML.

Esecuzione di Docker Compose con Variabili di Ambiente

Per eseguire Docker Compose e caricare le variabili di ambiente dal file .env, è sufficiente utilizzare il comando:

docker-compose --env-file .env up

Questo comando caricherà le variabili di ambiente definite nel file .env e le renderà disponibili per la configurazione dei servizi Docker.

Da notare che se il file delle configurazioni è denominato .env, e si trova allo stesso livello del file docker-compose.yml, puoi evitare di puntare esplicitamente il file nel comando. In questo caso, il comando può essere:

docker-compose up

Il comando precedente caricherà comunque le variabili definite in .env.

Versionamento file .env

Quando si gestiscono file .env, all'interno di un progetto, è importante porre l'attenzione sul versionamento e la sicurezza dei file, poiché essi sono ricchi di informazioni e credenziali molto importanti.

Di seguito ti mostro alcune buone pratiche per il versionamento dei file .env, che è opportuno seguire.

Non versionare file .env direttamente

Il file .env contiene informazioni sensibili quali credenziali di accesso, chiavi API, ed altre configurazioni che non andrebbero condivise con nessuno. Questo è il motivo per il quale, non dovresti mai versionare il file .env direttamente nel tuo sistema di versionamento (GIT).

Crea un file di esempio

La buona pratica, per tenere traccia delle variabili da compilare all'interno del file .env del tuo progetto, è quella di creare un file di esempio .env.example e versionare questo file. Il versionamento del file .env.example consente, a chiunque si approccia al progetto, di capire quali variabili valorizzare e quindi di diventare operativo in pochissimo tempo.

Un file di esempio potrebbe essere il seguente:

BASE_BASEDIR=/percorso/del/tuo/volume
HTTP_PORT=inserire_qui_il_numero_di_porta_http
HTTPS_PORT=inserire_qui_il_numero_di_porta_https
DB_USER=il_tuo_username
DB_PASSWORD=la_tua_password

Come si evince, i dati inseriti sono tutti finti ma consentono di descrivere quali dovranno essere i valori che dovranno popolare i campi.

Aggiungi .env al .gitignore

Considerando che creerai il tuo file .env nel progetto, è buona pratica aggiungere la direttiva di non versionare il file all'interno del .gitignore, come segue:

# .gitignore
.env

Documenta l'uso del file .env

Un'altra buona pratica è quella di documentare l'utilizzo del file .env, all'interno del README.md di progetto. In questo modo comunicherai, come un nuovo utente dovrà configurare il suo ambiente per poter cominciare a lavorare.

Stampa delle variabili di ambiente in Python

Puoi implementare il seguente codice per stampare, all'interno di uno script Python, le variabili d'ambiente ricevute da docker-compose.yml.

Per fare ciò, in primo luogo crea un file print_env.py, che legge e stampa le variabili d'ambiente:

import os

# Elenco delle variabili d'ambiente che vuoi stampare
env_vars = ['DB_HOST', 'DB_USER', 'DB_PASSWORD', 'HTTP_PORT', 'HTTPS_PORT']

for var in env_vars:
    value = os.getenv(var)
    print(f'{var}: {value}')

Successivamente, crea il file .env, come segue:

DB_HOST=localhost
DB_USER=root
DB_PASSWORD=mysecret
HTTP_PORT=8080
HTTPS_PORT=8443

Crea a questo punto il Dockerfile per costruire l'immagine, come segue:

FROM python:3.9-slim

WORKDIR /app

COPY print_env.py .

CMD ["python", "print_env.py"]

Infine, crea il docker-compose.yml, come segue:

version: '3.8'

services:
  print_env:
    build: .
    restart: unless-stopped
    network_mode: bridge
    environment:
      - DB_HOST=${DB_HOST}
      - DB_USER=${DB_USER}
      - DB_PASSWORD=${DB_PASSWORD}
      - HTTP_PORT=${HTTP_PORT}
      - HTTPS_PORT=${HTTPS_PORT}
    command: python print_env.py

Per avviare il container, eseguire il comando:

docker-compose up --build

Vantaggi della Gestione delle Variabili di Ambiente

L'utilizzo di un file .env per definire le variabili di ambiente offre diversi vantaggi:

  • Flessibilità: È possibile cambiare rapidamente le configurazioni per diversi ambienti (sviluppo, test, produzione) senza modificare il file docker-compose.yml.
  • Sicurezza: Le informazioni sensibili, come password e chiavi API, possono essere gestite in modo più sicuro e isolato dal codice sorgente.
  • Manutenibilità: Centralizzare le configurazioni di ambiente in un unico file facilita la gestione e la manutenzione del progetto.

Conclusione

La gestione delle variabili di ambiente con Docker Compose è una pratica potente che semplifica la configurazione e la gestione dei container Docker. Creando un file .env e integrandolo correttamente con il file docker-compose.yml, è possibile gestire le configurazioni in modo efficiente e sicuro. Questa tecnica è fondamentale per garantire che le applicazioni funzionino correttamente in diversi ambienti, migliorando la produttività e la qualità del software.

Inizia subito a utilizzare le variabili di ambiente nei tuoi progetti Docker e sperimenta i benefici di una configurazione più flessibile e gestibile.