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.