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

Come semplificare la composizione di file Docker con ancore ed estensioni YAML

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.


Docker
  1. Come distribuire e gestire MongoDB con Docker

  2. Come installare e ospitare il server OpenVPN con Docker

  3. Come proteggere i dati sensibili con Docker Compose Secrets

  4. Come utilizzare i profili di servizio per semplificare gli stack in Docker Compose

  5. Come installare e utilizzare Docker Compose su CentOS

Come installare Docker e Docker Compose su Linux

Come distribuire Docker Compose Stack su Kubernetes con Kompose

Come trovare vulnerabilità in contenitori e file con Grype

Come copiare file con Docker cp nel tuo Docker Container

Come eseguire Jenkins in Docker usando Docker Compose con volumi

Come copiare file tra host e contenitore Docker