Perché un servizio Compose usa il file .env sbagliato solo dopo il riavvio dell’host?

Eva Wong è la Technical Writer e smanettatrice residente di ZimaSpace. Una geek da sempre con una passione per homelab e software open-source, si specializza nel tradurre concetti tecnici complessi in guide accessibili e pratiche. Eva crede che l'auto-ospitare debba essere divertente, non intimidatorio. Attraverso i suoi tutorial, dà potere alla comunità di demistificare le configurazioni hardware, dalla costruzione del loro primo NAS al dominio dei container Docker.

Un servizio Compose può utilizzare valori di ambiente diversi dopo il riavvio quando il launcher eseguito all’avvio risolve un’altra directory del progetto, un altro file env o un’altra fonte di precedenza.

Un comando manuale può essere eseguito dalla cartella corretta con un determinato ambiente della shell, mentre systemd, uno scheduler NAS o Portainer avvia lo stesso file Compose da un contesto diverso dopo l’avvio. Il servizio potrebbe anche riavviare un container esistente il cui ambiente è stato fissato al momento della creazione, invece di rileggere il file modificato. Prima di modificare più file contemporaneamente, confronta il modello Compose renderizzato e l’ambiente del processo in esecuzione nei percorsi manuale e di avvio.

Confronta l’ambiente in esecuzione con il file previsto

Annota l’ID del container, l’ora di creazione, l’immagine, le etichette Compose, il nome del progetto e i valori effettivamente visibili nel processo principale. Confrontali con il file env previsto senza stampare i segreti nei log condivisi.

L’ambiente del processo Linux espone i valori forniti al momento dell’esecuzione, offrendo una prova più solida rispetto alla lettura di un file env che il container corrente potrebbe non aver mai utilizzato.

Se il container contiene i vecchi valori ed è stato creato prima della distribuzione eseguita al riavvio, il servizio potrebbe essersi limitato a riavviarlo. Se il container è nuovo, continua verificando la precedenza e la risoluzione dei percorsi.

Applica la precedenza delle variabili d’ambiente Compose nell’ordine corretto

Elenca ogni fonte per una variabile innocua: flag CLI, valori della shell, environment:, env_file:, .env predefinito o esplicito e ENV dell’immagine.

Docker definisce un ordine formale di precedenza delle variabili d’ambiente, quindi un file env corretto può comunque perdere a favore di un valore con priorità maggiore iniettato dal servizio di avvio o dal gestore dello stack.

Non cercare soltanto nomi di file duplicati. Cerca il nome della variabile nel modello Compose renderizzato, nel file dell’unità, nelle impostazioni del gestore, nell’ambiente della shell e nei valori predefiniti dell’immagine.

Controlla la directory del progetto e i percorsi env relativi

Confronta la directory di lavoro del comando manuale con quella del launcher di avvio, gli argomenti dei file Compose, la directory del progetto e i riferimenti relativi a env_file.

La Compose Specification definisce il modello applicativo utilizzato per risolvere servizi e configurazione, quindi la definizione del progetto selezionata e i relativi percorsi sono input della distribuzione, non proprietà riscoperte dal container in esecuzione.

Utilizza percorsi assoluti per i file env essenziali all’avvio quando lo strumento di distribuzione lo consente, oppure imposta esplicitamente la directory del progetto e quella di lavoro, così che gli avvii manuali e automatici risolvano gli stessi file.

-15% OFF

Ispeziona la directory di lavoro e i file d’ambiente di systemd

Leggi l’unità effettiva, tutti i drop-in, WorkingDirectory=, Environment=, EnvironmentFile= ed ExecStart=. Confronta l’unità caricata all’avvio con il comando utilizzato manualmente.

Le impostazioni di esecuzione di systemd definiscono la directory di lavoro e i file d’ambiente del servizio, che non ereditano automaticamente la directory corrente o le variabili esportate da una shell interattiva di login.

Dopo aver modificato un’unità o un drop-in, ricarica il gestore systemd e ispeziona nuovamente l’unità effettiva. Modificare un modello o un file inutilizzato non cambia il servizio che viene realmente avviato.

Controlla le variabili del gestore dello stack e lo stato di distribuzione memorizzato

Se Portainer o un’interfaccia NAS gestisce lo stack, confronta le variabili salvate, il file env caricato, il percorso della distribuzione Git, il comportamento di aggiornamento tramite webhook e il modello Compose visualizzato.

Portainer distingue il comportamento di .env e stack.env, quindi i valori inseriti nel gestore possono differire da quelli di un file modificato direttamente sull’host.

Scegli un’unica fonte di verità. Uno stack gestito da Git o da un editor web non dovrebbe essere avviato manualmente anche da un’altra copia locale dopo ogni riavvio.

Ricrea il container invece di limitar­ti a riavviarlo

Confronta l’ora di creazione del container con quella della modifica del file env. Esegui il rendering della configurazione Compose prevista, quindi ricrea in modo controllato solo il servizio interessato.

Le indicazioni di Red Hat per systemd raccomandano di controllare i file e le sostituzioni effettivamente utilizzati da un servizio prima di riavviarlo, evitando che un’unità obsoleta o un wrapper ricrei il container con i vecchi valori.

Il riavvio di un container non ricostruisce il suo ambiente da Compose. Ricrealo solo dopo aver protetto i dati persistenti e aver verificato che il modello renderizzato punti ai volumi e ai segreti previsti.

Fai in modo che avvio manuale, riavvio e nuova distribuzione producano lo stesso modello

Fissa i file Compose, il nome del progetto, la directory del progetto, il percorso del file env, il proprietario dello stack e la dipendenza dall’avvio. Salva una configurazione renderizzata priva di segreti e un’impronta dell’ambiente innocua.

L’articolo di ZimaSpace sull’ambito del backup Docker fornisce la regola correlata: i file d’ambiente e le definizioni di distribuzione devono essere conservati insieme allo stato persistente.

Il problema è risolto quando una ricreazione manuale, il riavvio dell’host, un aggiornamento pianificato e una nuova distribuzione dal gestore dello stack creano tutti il servizio con la stessa impronta dell’ambiente priva di segreti.

Domande frequenti

Qual è la differenza tra .env ed env_file?

Un file .env del progetto fornisce comunemente valori di interpolazione a Compose, mentre un env_file del servizio fornisce variabili al container. La loro interazione e precedenza dipendono dal modello Compose completo.

Il riavvio di un container ricarica un file env modificato?

No. I valori d’ambiente vengono impostati quando il container viene creato. Normalmente è necessario ricreare il servizio dalla configurazione Compose corretta.

Perché il problema compare solo dopo il riavvio?

Il percorso di riavvio potrebbe utilizzare un’unità systemd, uno scheduler, variabili memorizzate nel gestore, un’altra directory di lavoro o una copia Compose più vecchia, diversa da quella utilizzata per l’avvio manuale.

Supporto e consigli

Altro da leggere

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.