Header Ads

Como simplificar arquivos Docker Compose com âncoras e extensões YAML

O Docker Compose permite gerenciar vários contêineres do Docker e seus recursos associados, como volumes e redes. Você escreve arquivos YAML declarativos que o Compose usa para criar sua pilha de contêineres.

Seus arquivos docker-compose. yml podem se tornar repetitivos quando você está trabalhando com uma pilha complexa. Os serviços podem compartilhar opções de configuração, fazendo com que você duplique seções de seu arquivo. As atualizações posteriores podem levar a erros se você se esquecer de atualizar todas as instâncias de uma seção.

Como os arquivos Compose são arquivos YAML simples, você pode aproveitar as vantagens dos recursos YAML integrados para modularizar suas definições de pilha. Âncoras, aliases e extensões permitem abstrair seções YAML em blocos reutilizáveis. Você pode adicionar uma referência à seção em cada lugar em que for necessária.

O que é uma âncora?

As âncoras YAML são um recurso que permite identificar um item e, em seguida, referenciá-lo em outro lugar em seu arquivo. Âncoras são criadas usando o & assinar. O sinal é seguido por um nome alternativo. Você pode usar este alias posteriormente para fazer referência ao valor após a âncora.

Veja como você pode usar uma âncora para evitar a repetição das políticas de reinicialização do contêiner:

serviços: httpd: imagem: httpd: última reinicialização: & restartpolicy a menos que mysql: image: mysql: última reinicialização: * restartpolicy

A âncora é referenciada usando o caractere * e seu alias. Você deve garantir que não haja espaço entre os caracteres & / * e o seguinte nome de alias.

Este exemplo mostra como um valor de linha única pode ser reutilizado com âncoras. A mudança da política de reinicialização da pilha agora pode ser feita em um só lugar, sem editar os serviços individualmente.

Âncoras multilinhas

Âncoras podem ter valores multilinhas. Você os cria usando a mesma sintaxe de uma âncora de linha única. Isso é útil quando você precisa fornecer um conjunto de detalhes de configuração para vários serviços.

serviços: primeiro: imagem: minha-imagem: ambiente mais recente: & env - CONFIG_KEY - EXAMPLE_KEY - DEMO_VAR segundo: imagem: outra-imagem: ambiente mais recente: * env

O segundo serviço agora puxará as mesmas variáveis ​​de ambiente do primeiro. Não tivemos que repetir a lista de variáveis ​​de ambiente, tornando-a muito mais fácil de manter no futuro.

Estendendo valores âncora

O exemplo de ambiente acima pega o valor da âncora e o usa como está. Freqüentemente, você desejará estender a âncora para adicionar valores adicionais. Você pode fazer isso com uma sintaxe alternativa.

Modifique o segundo serviço da seguinte maneira:

serviços: segundo: imagem: outra-imagem: ambiente mais recente: < & lt ;: * env - AN_EXTRA_KEY - SECOND_SPECIFIC_KEY

O serviço agora puxa a configuração do ambiente base da âncora env. Chaves adicionais são então adicionadas à lista de ambientes. Você também pode substituir as chaves existentes definidas pela âncora.

Usando campos de extensão

Outra abordagem à modularização são os campos de extensão. Esses são fragmentos YAML especiais de nível superior que serão ignorados pelo Docker.

O Docker geralmente tenta interpretar qualquer nó na raiz de um arquivo Compose. O analisador irá ignorar os campos de extensão prefixados com x-. Você pode usar esses campos para encapsular a configuração compartilhada para referência posterior. Combine campos de extensão com âncoras para abstrair seções de suas definições de serviço.

ambiente x-env: & env: - CONFIG_KEY - EXAMPLE_KEY   serviços: primeiro: < & lt ;: * imagem env: minha-imagem: segundo mais recente: < & lt ;: * imagem env: outra imagem: mais recente

Este arquivo Compose é um refinamento adicional sobre o exemplo mostrado acima. As variáveis ​​de ambiente não pertencem mais a nenhum dos serviços. Eles foram retirados completamente, para o campo de extensão x-env.

Isso define um novo nó que contém o campo de ambiente. Uma âncora YAML é usada (& env) para que ambos os serviços possam fazer referência ao valor do campo de extensão &’ s.

Composibilidade

Usar esses recursos permite que você divida seus arquivos do Compose em blocos autocontidos. Isso ajuda a evitar definições de serviço excessivamente repetitivas. Qualquer coisa comum a mais de um serviço deve ser elevada a um campo de extensão.

Além de ajudar na manutenção, essa prática comunica suas intenções a outros colaboradores. É claro que todos os campos de extensão de nível superior contêm campos genéricos. Eles não estão vinculados a nenhum serviço específico e podem ser reutilizados gratuitamente.

Âncoras e campos de extensão permitem compor suas definições de serviço a partir de blocos reutilizáveis ​​de YAML. Ao manter cada campo pequeno, seus serviços podem misturar e combinar seções de configuração das âncoras disponíveis. Manter seus arquivos do Compose deve se tornar menos trabalhoso.

Outras abordagens para a modularidade

Além de âncoras e extensões, não se esqueça de que você sempre pode dividir suas definições do Compose em vários arquivos do Compose. Isso pode se tornar necessário quando você tem mais de um punhado de serviços individuais.

Usar vários arquivos Compose permite que você atribua a cada serviço seu próprio arquivo. Você também pode criar arquivos de substituição, onde os valores de um nó são substituídos ou estendidos. O Compose mesclará todos os arquivos para criar a configuração final do tempo de execução.

service. yml

serviços: serviço: imagem: minha-imagem: mais recente

service-dev. yml

serviços: serviço: ambiente: - DEV_MODE = verdadeiro

Neste exemplo, a aplicação de ambos os arquivos Compose resultaria em um serviço, my-image: latest, com a variável de ambiente DEV_MODE definida. Para usar vários arquivos com o Compose CLI, passe o sinalizador -f:

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

Os arquivos são mesclados na ordem especificada.

Resumo

Os arquivos do Docker Compose podem se tornar pesados ​​e repetitivos. Se você está gastando tempo copiando valores sobre, considere abstrair seções de seus serviços em blocos YAML dedicados.

Recursos como âncoras e extensões ajudam na manutenção e facilitam a experiência de autoria. Nem todo arquivo Compose se beneficiará com – alguns serviços podem ter pouco em comum entre si – então avalie sua pilha específica antes de começar.

Nenhum comentário