Skip to main content

Âncora e Herança | Herânca de variáveis no Docker, x-shared: &shared, <<: | Docker

  • Âncora e Herança | Docker

Introdução

O Docker Compose é uma ferramenta popular para definir e executar aplicativos multi-contêiner. Ao criar arquivos de configuração docker-compose.yml, você pode precisar de configuração comum entre vários serviços. Para evitar duplicação de código e facilitar a manutenção, o Docker Compose permite o uso de âncoras e herança.

O que são âncoras e herança?

  • Âncoras permitem criar blocos de configuração reutilizáveis, que podem ser aplicados em diferentes seções do arquivo docker-compose.yml.
  • Herança permite que um serviço herde a configuração de um bloco de âncora, evitando a repetição de código.

A chave x- em Docker Compose é usada para definir "âncoras" e deve ser seguida de um nome para o bloco de configuração. Esse bloco pode ser referenciado em diferentes serviços usando a sintaxe <<: *<nome_da_âncora>.

Estrutura de um arquivo Docker Compose com Ancoragem

Exemplo de um arquivo docker-compose.yml

version: '3.8'

# Definição dos volumes
volumes:
db_storage:
n8n_storage:
redis_storage:

# Bloco de configuração compartilhada
x-shared: &shared
restart: always
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD}
- EXECUTIONS_MODE=queue
- QUEUE_BULL_REDIS_HOST=redis
- QUEUE_HEALTH_CHECK_ACTIVE=true
- N8N_BASIC_AUTH_ACTIVE=false
- N8N_PROTOCOL=https
- VUE_APP_URL_BASE_API=https://${N8N_HOST}
- WEBHOOK_TUNNEL_URL=https://${N8N_HOST}
links:
- postgres
- redis
volumes:
- n8n_storage:/home/node/
depends_on:
redis:
condition: service_healthy
postgres:
condition: service_healthy

# Serviços definidos no Docker Compose
services:
https-portal:
image: steveltn/https-portal:1
ports:
- '80:80'
- '443:443'
links:
- n8n
restart: always
environment:
DOMAINS: '${N8N_HOST} -> http://n8n:5678'
STAGE: ${STAGE:-staging}
FORCE_RENEW: 'true'
CUSTOM_NGINX_SERVER_CONFIG_BLOCK: |
proxy_buffering off;

postgres:
image: postgres:11
restart: always
environment:
- POSTGRES_USER
- POSTGRES_PASSWORD
- POSTGRES_DB
- POSTGRES_NON_ROOT_USER
- POSTGRES_NON_ROOT_PASSWORD
volumes:
- db_storage:/var/lib/postgresql/data
- ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh
healthcheck:
test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
interval: 5s
timeout: 5s
retries: 10

redis:
image: redis:6-alpine
restart: always
volumes:
- redis_storage:/data
healthcheck:
test: ['CMD', 'redis-cli', 'ping']
interval: 5s
timeout: 5s
retries: 10

n8n:
<<: *shared # Herda configurações de 'shared'
image: n8nio/n8n
command: /bin/sh -c "n8n start"
# ports:
# - 5678:5678

n8n-worker:
<<: *shared # Herda configurações de 'shared'
image: n8nio/n8n
command: /bin/sh -c "sleep 5; n8n worker"
depends_on:
- n8n

Explicação das Seções

1. Definição de Volumes

volumes:
db_storage:
n8n_storage:
redis_storage:

Essa seção define volumes persistentes que serão usados para armazenar dados de diferentes serviços, como PostgreSQL (db_storage), N8N (n8n_storage) e Redis (redis_storage).

2. Bloco x-shared

x-shared: &shared
restart: always
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD}
- EXECUTIONS_MODE=queue
- QUEUE_BULL_REDIS_HOST=redis
- QUEUE_HEALTH_CHECK_ACTIVE=true
- N8N_BASIC_AUTH_ACTIVE=false
- N8N_PROTOCOL=https
- VUE_APP_URL_BASE_API=https://${N8N_HOST}
- WEBHOOK_TUNNEL_URL=https://${N8N_HOST}
links:
- postgres
- redis
volumes:
- n8n_storage:/home/node/
depends_on:
redis:
condition: service_healthy
postgres:
condition: service_healthy

O bloco x-shared define uma série de configurações comuns que podem ser reutilizadas em diferentes serviços. Ele é ancorado com o nome shared (&shared). As configurações incluem:

  • Política de reinício: restart: always assegura que o serviço seja reiniciado automaticamente caso falhe.
  • Variáveis de ambiente: Definem as variáveis necessárias para a configuração do N8N, incluindo informações sobre o banco de dados PostgreSQL e o Redis.
  • Dependências: A chave depends_on garante que os serviços de PostgreSQL e Redis estejam saudáveis antes de iniciar o serviço que depende deles.
  • Volumes: O volume n8n_storage é montado em /home/node/ no contêiner N8N.

3. Herança da Configuração em Serviços

Nos serviços n8n e n8n-worker, as configurações do bloco x-shared são herdadas com a sintaxe:

  n8n:
<<: *shared
image: n8nio/n8n
command: /bin/sh -c "n8n start"

A chave <<: *shared faz com que o serviço n8n herde todas as configurações do bloco shared. Isso elimina a necessidade de repetir configurações como restart, environment, links, volumes, e depends_on em cada serviço individualmente.

4. Outros Serviços (https-portal, postgres, redis)

  • O serviço https-portal é responsável por fornecer HTTPS para o N8N, configurando o domínio e o proxy reverso.
  • O serviço postgres configura o banco de dados PostgreSQL, incluindo a criação de volumes persistentes e a inicialização com um script init-data.sh.
  • O serviço redis configura o Redis, com um volume persistente para armazenar os dados.

Benefícios do Uso de Âncoras e Herança

  • Redução de duplicação de código: Evita que as mesmas configurações sejam repetidas em vários serviços, facilitando a manutenção.
  • Facilidade de manutenção: Alterações em configurações comuns podem ser feitas em um único lugar, e essas mudanças são refletidas automaticamente nos serviços que herdam essas configurações.
  • Clareza e organização: O arquivo docker-compose.yml se torna mais legível e organizado, especialmente em configurações complexas com múltiplos serviços.

Conclusão

O uso de âncoras e herança no Docker Compose torna os arquivos de configuração mais eficientes e fáceis de manter. Com a chave x-shared e a herança de configurações usando <<: *shared, você pode criar configurações reutilizáveis e garantir que as mudanças sejam aplicadas de forma consistente em diferentes partes do seu ambiente Docker.