Â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: alwaysassegura 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_ongarante 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
postgresconfigura o banco de dados PostgreSQL, incluindo a criação de volumes persistentes e a inicialização com um scriptinit-data.sh. - O serviço
redisconfigura 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.ymlse 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.