Docker Compose ti consente di gestire più contenitori Docker e le risorse associate come volumi e reti. Scrivi file YAML dichiarativi che Compose utilizza per creare il tuo stack di contenitori.
Il tuo docker-compose.yml
i file possono diventare ripetitivi quando si lavora con uno stack complesso. I servizi potrebbero condividere le opzioni di configurazione, causando la duplicazione di sezioni del file. Aggiornamenti successivi possono causare errori se dimentichi di aggiornare ogni istanza di una sezione.
Poiché i file Compose sono semplici file YAML, puoi sfruttare le funzionalità YAML integrate per modularizzare le definizioni dello stack. Ancoraggi, alias ed estensioni ti consentono di astrarre sezioni YAML in blocchi riutilizzabili. Puoi aggiungere un riferimento alla sezione in ogni punto necessario.
Cos'è un'ancora?
Gli anchor YAML sono una funzionalità che ti consente di identificare un elemento e quindi di fare riferimento ad esso altrove nel tuo file. Gli ancoraggi vengono creati utilizzando &
cartello. Il segno è seguito da un nome alias. Puoi usare questo alias in seguito per fare riferimento al valore che segue l'ancora.
Ecco come potresti utilizzare un'ancora per evitare di ripetere le politiche di riavvio del contenitore:
services: httpd: image: httpd:latest restart: &restartpolicy unless-stopped mysql: image: mysql:latest restart: *restartpolicy
L'ancora è referenziata usando il *
personaggio e il suo alias. Devi assicurarti che non ci sia spazio tra &
/*
caratteri e il seguente nome alias.
Questo esempio mostra come un valore a riga singola può essere riutilizzato con gli ancoraggi. La modifica del criterio di riavvio dello stack ora può essere eseguita in un'unica posizione, senza modificare i servizi singolarmente.
Ancora multilinea
Gli ancoraggi possono avere valori su più righe. Li crei usando la stessa sintassi di un'ancora a riga singola. Ciò è utile quando devi fornire una serie di dettagli di configurazione a più servizi.
services: first: image: my-image:latest environment: &env - CONFIG_KEY - EXAMPLE_KEY - DEMO_VAR second: image: another-image:latest environment: *env
Il second
il servizio ora inserirà le stesse variabili di ambiente di first
. Non abbiamo dovuto ripetere l'elenco delle variabili d'ambiente, rendendolo molto più gestibile in futuro.
Estensione dei valori di ancoraggio
L'esempio di ambiente sopra prende il valore dell'ancora e lo usa così com'è. Spesso vorrai estendere l'ancora per aggiungere valori aggiuntivi. Puoi farlo con una sintassi alternativa.
Modifica il second
servizio come segue:
services: second: image: another-image:latest environment: <<: *env - AN_EXTRA_KEY - SECOND_SPECIFIC_KEY
Il servizio ora estrae la configurazione dell'ambiente di base da env
ancora. Ulteriori chiavi vengono quindi aggiunte all'elenco degli ambienti. Puoi anche sostituire le chiavi esistenti definite dall'ancora.
Utilizzo dei campi estensione
Un altro approccio alla modularizzazione è l'estensione dei campi. Questi sono frammenti YAML speciali di primo livello che verranno ignorati da Docker.
Docker di solito tenta di interpretare qualsiasi nodo nella radice di un file Compose. Il parser ignorerà i campi di estensione preceduti da x-
. È possibile utilizzare questi campi per incapsulare la configurazione condivisa per riferimenti futuri. Combina campi di estensione con ancoraggi per astrarre sezioni dalle definizioni dei tuoi servizi.
x-env: &env environment: - CONFIG_KEY - EXAMPLE_KEY services: first: <<: *env image: my-image:latest second: <<: *env image: another-image:latest
Questo file Compose è un ulteriore perfezionamento rispetto all'esempio mostrato sopra. Le variabili di ambiente non appartengono più a nessuno dei servizi. Sono stati rimossi completamente, nel x-env
campo di estensione.
Questo definisce un nuovo nodo che contiene l'environment
campo. Viene utilizzata un'ancora YAML (&env
) in modo che entrambi i servizi possano fare riferimento al valore del campo dell'estensione.
Componibilità
L'utilizzo di queste funzionalità ti consente di suddividere i tuoi file Compose in blocchi autonomi. Ciò consente di evitare definizioni di servizio eccessivamente ripetitive. Qualsiasi cosa comune a più di un servizio dovrebbe essere trasferita in un campo di estensione.
Oltre a favorire la manutenibilità, questa pratica comunica le tue intenzioni ad altri collaboratori. È chiaro che tutti i campi di estensione di primo livello contengono campi generici. Non sono legati a nessun servizio particolare e possono essere liberamente riutilizzati.
Ancoraggi e campi di estensione ti consentono di comporre le definizioni del servizio da blocchi riutilizzabili di YAML. Mantenendo ogni campo piccolo, i tuoi servizi possono combinare e abbinare le sezioni di configurazione dagli anchor disponibili. La manutenzione dei file Compose dovrebbe diventare meno faticosa.
Altri approcci alla modularità
Oltre ad ancoraggi ed estensioni, non dimenticare che puoi sempre dividere le definizioni di Compose in più file Compose. Questo può diventare necessario quando hai più di una manciata di servizi individuali.
L'utilizzo di più file Compose consente di allocare a ciascun servizio il proprio file. Puoi anche creare file di sostituzione, in cui i valori di un nodo vengono sostituiti o estesi. Compose unirà tutti i file per creare la configurazione di runtime finale.
service.yml
services: service: image: my-image:latest
service-dev.yml
services: service: environment: - DEV_MODE=true
In questo esempio, l'applicazione di entrambi i file Compose risulterebbe in un servizio, my-image:latest
, con il DEV_MODE
insieme di variabili di ambiente. Per utilizzare più file con Compose CLI, passa il -f
bandiera:
docker-compose -f service.yml -f service-dev.yml up -d
I file vengono uniti nell'ordine specificato.
Riepilogo
I file Docker Compose possono diventare ingombranti e ripetitivi. Se stai dedicando del tempo a copiare valori, prendi in considerazione l'astrazione di sezioni dei tuoi servizi in blocchi YAML dedicati.
Funzionalità come ancoraggi ed estensioni facilitano la manutenibilità e semplificano l'esperienza di creazione. Non tutti i file Compose ne trarranno vantaggio:alcuni servizi potrebbero avere poco in comune tra loro, quindi valuta il tuo stack specifico prima di iniziare.