GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Cómo simplificar los archivos de composición de Docker con anclajes y extensiones YAML

Docker Compose le permite administrar varios contenedores Docker y sus recursos asociados, como volúmenes y redes. Usted escribe archivos YAML declarativos que Compose usa para crear su pila de contenedores.

Tu docker-compose.yml los archivos pueden volverse repetitivos cuando trabaja con una pila compleja. Los servicios pueden compartir opciones de configuración, lo que hace que duplique secciones de su archivo. Las actualizaciones posteriores pueden generar errores si olvida actualizar cada instancia de una sección.

Debido a que los archivos de Compose son archivos YAML simples, puede aprovechar las características integradas de YAML para modularizar sus definiciones de pila. Las anclas, los alias y las extensiones te permiten abstraer secciones YAML en bloques reutilizables. Puede agregar una referencia a la sección en cada lugar que sea necesario.

¿Qué es un ancla?

Los anclajes YAML son una función que le permite identificar un elemento y luego hacer referencia a él en otra parte de su archivo. Los anclajes se crean utilizando & señal. El signo va seguido de un nombre de alias. Puede usar este alias más adelante para hacer referencia al valor que sigue al ancla.

Así es como podría usar un ancla para evitar repetir las políticas de reinicio de contenedores:

services:
  httpd:
    image: httpd:latest
    restart: &restartpolicy unless-stopped
  mysql:
    image: mysql:latest
    restart: *restartpolicy

Se hace referencia al ancla usando el * personaje y su alias. Debes asegurarte de que no haya espacio entre & /* caracteres y el siguiente nombre de alias.

Este ejemplo muestra cómo se puede reutilizar un valor de una sola línea con anclas. Ahora se puede cambiar la política de reinicio de pila en un solo lugar, sin editar los servicios individualmente.

Anclajes multilínea

Los anclas pueden tener valores de varias líneas. Los crea utilizando la misma sintaxis que un ancla de una sola línea. Esto es útil cuando necesita proporcionar un conjunto de detalles de configuración a varios servicios.

services:
  first:
    image: my-image:latest
    environment: &env
      - CONFIG_KEY
      - EXAMPLE_KEY
      - DEMO_VAR
  second:
    image: another-image:latest
    environment: *env

El second El servicio ahora extraerá las mismas variables de entorno que first . No hemos tenido que repetir la lista de variables de entorno, lo que la hace mucho más fácil de mantener en el futuro.

Extender valores de anclaje

El ejemplo de entorno anterior toma el valor del ancla y lo usa tal cual. A menudo querrá extender el ancla para agregar valores adicionales. Puede hacer esto con una sintaxis alternativa.

Modificar el second servicio de la siguiente manera:

services:
  second:
    image: another-image:latest
    environment:
      <<: *env
      - AN_EXTRA_KEY
      - SECOND_SPECIFIC_KEY

El servicio ahora extrae la configuración del entorno base del env ancla. A continuación, se agregan claves adicionales a la lista de entornos. También puede anular las claves existentes definidas por el ancla.

Uso de campos de extensión

Otro enfoque de la modularización son los campos de extensión. Estos son fragmentos YAML especiales de nivel superior que Docker ignorará.

Docker generalmente intenta interpretar cualquier nodo en la raíz de un archivo Compose. El analizador ignorará los campos de extensión con el prefijo x- . Puede usar estos campos para encapsular la configuración compartida para referencia posterior. Combine campos de extensión con anclas para extraer secciones de sus definiciones de servicio.

x-env: &env
  environment:
    - CONFIG_KEY
    - EXAMPLE_KEY
 
services:
  first:
    <<: *env
    image: my-image:latest
  second:
    <<: *env
    image: another-image:latest

Este archivo Compose es un refinamiento adicional sobre el ejemplo que se muestra arriba. Las variables de entorno ya no pertenecen a ninguno de los servicios. Han sido sacados por completo, en el x-env campo de extensión.

Esto define un nuevo nodo que contiene el environment campo. Se utiliza un ancla YAML (&env ) para que ambos servicios puedan hacer referencia al valor del campo de extensión.

Composibilidad

Hacer uso de estas funciones le permite dividir sus archivos de Compose en partes independientes. Esto le ayuda a evitar definiciones de servicio demasiado repetitivas. Todo lo que sea común a más de un servicio debe colocarse en un campo de extensión.

Además de ayudar a la mantenibilidad, esta práctica comunica sus intenciones a otros colaboradores. Está claro que cualquier campo de extensión de nivel superior contiene campos genéricos. No están vinculados a ningún servicio en particular y se pueden reutilizar libremente.

Las anclas y los campos de extensión te permiten componer tus definiciones de servicio a partir de bloques reutilizables de YAML. Al mantener cada campo pequeño, sus servicios pueden mezclar y combinar secciones de configuración de los anclajes disponibles. Mantener sus archivos de Compose debería convertirse en una tarea menos tediosa.

Otros enfoques de la modularidad

Además de las anclas y las extensiones, no olvide que siempre puede dividir sus definiciones de Compose en varios archivos de Compose. Esto puede ser necesario cuando tiene más de un puñado de servicios individuales.

El uso de varios archivos de Compose le permite asignar a cada servicio su propio archivo. También puede crear archivos de anulación, donde los valores de un nodo se reemplazan o amplían. Compose combinará todos los archivos para crear la configuración de tiempo de ejecución final.

service.yml

services:
  service:
    image: my-image:latest

service-dev.yml

services:
  service:
    environment:
      - DEV_MODE=true

En este ejemplo, la aplicación de ambos archivos de Compose daría como resultado un servicio, my-image:latest , con el DEV_MODE conjunto de variables de entorno. Para usar varios archivos con Compose CLI, pase -f bandera:

docker-compose -f service.yml -f service-dev.yml up -d

Los archivos se fusionan en el orden especificado.

Resumen

Los archivos de Docker Compose pueden volverse difíciles de manejar y repetitivos. Si dedica tiempo a copiar valores, considere abstraer secciones de sus servicios en bloques YAML dedicados.

Funciones como anclajes y extensiones ayudan a mantener y facilitan la experiencia de creación. No todos los archivos de Compose se beneficiarán, algunos servicios pueden tener poco en común entre sí, así que evalúe su pila específica antes de comenzar.


Docker
  1. Cómo implementar y administrar MongoDB con Docker

  2. Cómo instalar y alojar un servidor OpenVPN con Docker

  3. Cómo proteger datos confidenciales con Docker Compose Secrets

  4. Cómo usar los perfiles de servicio para simplificar las pilas en Docker Compose

  5. Cómo instalar y usar Docker Compose en CentOS

Cómo instalar Docker y Docker Compose en Linux

Cómo implementar pilas de Docker Compose en Kubernetes con Kompose

Cómo encontrar vulnerabilidades en contenedores y archivos con Grype

Cómo copiar archivos con Docker cp a su Docker Container

Cómo ejecutar Jenkins en Docker usando Docker Compose con Volúmenes

Cómo copiar archivos entre el host y el contenedor Docker