Plugins¶
Docker Pilot has a robust plugin system that allows you to extend its functionality in a modular and flexible way.
Overview¶
Docker Pilot plugins allow you to:
- Add new commands
- Integrate with external tools
- Customize behaviors
- Automate specific tasks
- Create custom workflows
Plugin Architecture¶
Plugin Types¶
- Command Plugins: Add new CLI commands
- Hook Plugins: Execute at specific lifecycle points
- Integration Plugins: Connect with external tools
- UI Plugins: Modify the user interface
- Monitoring Plugins: Add monitoring capabilities
Plugin Structure¶
my-plugin/
āāā plugin.yml # Plugin manifest
āāā index.js # Entry point
āāā commands/ # Plugin commands
ā āāā deploy.js
ā āāā status.js
āāā hooks/ # Plugin hooks
ā āāā pre-start.js
ā āāā post-deploy.js
āāā templates/ # Templates
ā āāā docker-compose.yml
āāā assets/ # Static resources
ā āāā logo.png
āāā package.json # Node.js dependencies
Official Plugins¶
Backup Plugin¶
Adds advanced backup and restore functionality.
# Instalar plugin de backup
docker-pilot plugin install @docker-pilot/backup
# Usar plugin
docker-pilot backup create --name "backup-$(date +%Y%m%d)"
docker-pilot backup list
docker-pilot backup restore "backup-20231201"
Configuração:
# docker-pilot.yml
plugins:
backup:
enabled: true
config:
storage: "s3"
bucket: "meus-backups"
region: "us-east-1"
encryption: true
retention: 30 # dias
Plugin de Monitoramento¶
Monitora performance e saúde dos serviços.
# Instalar plugin de monitoramento
docker-pilot plugin install @docker-pilot/monitoring
# Usar plugin
docker-pilot monitor dashboard
docker-pilot monitor alerts
docker-pilot monitor export --format json
Configuração:
# docker-pilot.yml
plugins:
monitoring:
enabled: true
config:
metrics:
- cpu
- memory
- network
- disk
alerts:
cpu_threshold: 80
memory_threshold: 85
disk_threshold: 90
dashboard:
port: 3030
auth: true
Plugin de NotificaƧƵes¶
Envia notificaƧƵes para diferentes canais.
# Instalar plugin de notificaƧƵes
docker-pilot plugin install @docker-pilot/notifications
# Configurar notificaƧƵes
docker-pilot notifications setup slack
docker-pilot notifications test
Configuração:
# docker-pilot.yml
plugins:
notifications:
enabled: true
config:
channels:
slack:
webhook_url: "https://hooks.slack.com/..."
channel: "#devops"
email:
smtp_server: "smtp.gmail.com"
from: "noreply@empresa.com"
discord:
webhook_url: "https://discord.com/api/webhooks/..."
Plugin de Deploy¶
Facilita deploys para diferentes ambientes.
# Instalar plugin de deploy
docker-pilot plugin install @docker-pilot/deploy
# Fazer deploy
docker-pilot deploy staging
docker-pilot deploy production --confirm
Configuração:
# docker-pilot.yml
plugins:
deploy:
enabled: true
config:
environments:
staging:
registry: "registry.staging.com"
namespace: "staging"
auto_deploy: true
production:
registry: "registry.prod.com"
namespace: "production"
auto_deploy: false
require_confirmation: true
Plugins da Comunidade¶
Plugin Kubernetes¶
Integração com Kubernetes.
# Instalar plugin k8s
docker-pilot plugin install kubernetes-integration
# Gerar manifests K8s
docker-pilot k8s generate
docker-pilot k8s apply --environment staging
Plugin AWS¶
Integração com serviços AWS.
# Instalar plugin AWS
docker-pilot plugin install aws-integration
# Deploy para ECS
docker-pilot aws ecs deploy
docker-pilot aws ecr push
Plugin CI/CD¶
Integração com pipelines de CI/CD.
# Instalar plugin CI/CD
docker-pilot plugin install cicd-integration
# Gerar pipeline
docker-pilot cicd generate --provider github-actions
docker-pilot cicd generate --provider gitlab-ci
Desenvolvendo Plugins¶
Criando um Plugin BĆ”sico¶
- Criar estrutura bƔsica:
- Criar manifesto do plugin:
# plugin.yml
name: "meu-plugin"
version: "1.0.0"
description: "Meu plugin personalizado"
author: "Seu Nome"
homepage: "https://github.com/usuario/meu-plugin"
# Metadados
metadata:
category: "utility"
tags:
- "custom"
- "automation"
# Compatibilidade
compatibility:
docker_pilot: ">=1.0.0"
node: ">=14.0.0"
# Configuração
config:
schema:
type: "object"
properties:
api_key:
type: "string"
description: "API key para integração"
timeout:
type: "number"
default: 30
description: "Timeout em segundos"
# Comandos
commands:
- name: "hello"
description: "Comando de exemplo"
handler: "./commands/hello.js"
- name: "status"
description: "Verificar status"
handler: "./commands/status.js"
# Hooks
hooks:
before_start:
- "./hooks/pre-start.js"
after_deploy:
- "./hooks/post-deploy.js"
# PermissƵes
permissions:
- "read_config"
- "execute_commands"
- "access_network"
- Implementar comandos:
// commands/hello.js
module.exports = {
name: 'hello',
description: 'Comando de exemplo',
// OpƧƵes do comando
options: [
{
name: 'name',
alias: 'n',
type: 'string',
description: 'Nome para saudação',
default: 'World'
}
],
// Handler do comando
async handler(options, context) {
const { name } = options;
const { logger, config } = context;
logger.info(`Hello, ${name}!`);
// Acessar configuração do plugin
const apiKey = config.get('api_key');
if (apiKey) {
logger.debug('API key configurada');
}
return {
success: true,
message: `Hello, ${name}!`
};
}
};
- Implementar hooks:
// hooks/pre-start.js
module.exports = {
name: 'pre-start',
description: 'Executado antes de iniciar serviƧos',
async handler(context) {
const { logger, services, config } = context;
logger.info('Executando verificações pré-inicialização...');
// Verificar se serviços estão configurados corretamente
for (const service of services) {
if (!service.healthcheck) {
logger.warn(`Serviço ${service.name} não possui healthcheck`);
}
}
return {
success: true
};
}
};
API do Plugin¶
Context Object¶
O objeto context
fornecido aos handlers contƩm:
{
// Logger configurado
logger: {
debug: (message) => {},
info: (message) => {},
warn: (message) => {},
error: (message) => {}
},
// Configuração do plugin
config: {
get: (key) => {},
set: (key, value) => {},
has: (key) => {}
},
// ServiƧos do projeto
services: [
{
name: 'api',
image: 'myapp/api',
ports: ['3000:3000'],
// ...
}
],
// UtilitƔrios Docker
docker: {
exec: (container, command) => {},
logs: (container, options) => {},
inspect: (container) => {}
},
// Sistema de arquivos
fs: {
readFile: (path) => {},
writeFile: (path, content) => {},
exists: (path) => {}
},
// HTTP client
http: {
get: (url, options) => {},
post: (url, data, options) => {}
}
}
Plugin AvanƧado¶
// index.js
import path from "path";
class MeuPlugin {
constructor(context) {
this.context = context;
this.config = context.config;
this.logger = context.logger;
}
// Inicialização do plugin
async initialize() {
this.logger.info('Inicializando Meu Plugin...');
// Validar configuração
if (!this.config.get('api_key')) {
throw new Error('API key é obrigatória');
}
// Configurar recursos
await this.setupResources();
}
// Configurar recursos
async setupResources() {
// Criar diretórios necessÔrios
const dataDir = path.join(process.cwd(), '.meu-plugin');
if (!this.context.fs.exists(dataDir)) {
await this.context.fs.mkdir(dataDir, { recursive: true });
}
}
// Limpeza do plugin
async cleanup() {
this.logger.info('Limpando recursos do plugin...');
// Limpeza de recursos
}
// Comando personalizado
async executeCustomCommand(args) {
this.logger.info('Executando comando personalizado...');
// Lógica do comando
const result = await this.processData(args);
return {
success: true,
data: result
};
}
// Processamento interno
async processData(data) {
// Implementar lógica especĆfica
return data;
}
}
module.exports = MeuPlugin;
Instalação de Plugins¶
MĆ©todos de Instalação¶
-
NPM Registry:
-
Git Repository:
-
Local Path:
-
Tarball:
Gerenciamento de Plugins¶
# Listar plugins instalados
docker-pilot plugin list
# Mostrar informaƧƵes de um plugin
docker-pilot plugin info meu-plugin
# Habilitar/desabilitar plugin
docker-pilot plugin enable meu-plugin
docker-pilot plugin disable meu-plugin
# Atualizar plugin
docker-pilot plugin update meu-plugin
docker-pilot plugin update --all
# Remover plugin
docker-pilot plugin remove meu-plugin
# Verificar atualizaƧƵes
docker-pilot plugin outdated
Configuração de Plugins¶
Configuração Global¶
# ~/.docker-pilot/config.yml
plugins:
# Diretório de plugins
directory: "~/.docker-pilot/plugins"
# Auto-carregamento
auto_load: true
# Registry de plugins
registry: "https://registry.docker-pilot.com"
# Cache
cache:
enabled: true
ttl: 3600
# Plugins habilitados globalmente
global:
- "@docker-pilot/backup"
- "@docker-pilot/monitoring"
Configuração por Projeto¶
# docker-pilot.yml
plugins:
# Plugins especĆficos do projeto
enabled:
- "meu-plugin"
- "@docker-pilot/deploy"
# Configuração dos plugins
config:
meu-plugin:
api_key: "${PLUGIN_API_KEY}"
timeout: 30
deploy:
environments:
staging:
registry: "staging.registry.com"
production:
registry: "prod.registry.com"
Marketplace de Plugins¶
Navegação¶
# Buscar plugins
docker-pilot plugin search backup
docker-pilot plugin search --category monitoring
# Mostrar detalhes
docker-pilot plugin view @docker-pilot/backup
# Avaliar plugin
docker-pilot plugin rate @docker-pilot/backup 5
Publicação¶
# Validar plugin
docker-pilot plugin validate
# Publicar plugin
docker-pilot plugin publish
# Atualizar versão
docker-pilot plugin publish --version 1.1.0
Debugging de Plugins¶
Logs de Plugin¶
# Logs especĆficos do plugin
docker-pilot plugin logs meu-plugin
# Logs em tempo real
docker-pilot plugin logs meu-plugin --follow
# NĆvel de debug
docker-pilot --log-level debug plugin logs meu-plugin
Modo Debug¶
# Executar plugin em modo debug
docker-pilot --debug plugin run meu-plugin comando
# Validar plugin
docker-pilot plugin validate ./meu-plugin --verbose
SeguranƧa de Plugins¶
PermissƵes¶
Os plugins devem declarar permissƵes necessƔrias:
# plugin.yml
permissions:
- "read_config" # Ler configuração
- "write_config" # Escrever configuração
- "execute_commands" # Executar comandos
- "access_network" # Acesso Ć rede
- "read_filesystem" # Ler sistema de arquivos
- "write_filesystem" # Escrever sistema de arquivos
- "access_docker" # Acesso ao Docker daemon
Sandbox¶
Plugins são executados em ambiente sandboxed:
- Acesso limitado ao sistema de arquivos
- Rede controlada
- Recursos limitados
- PermissƵes explĆcitas
Verificação¶
# Verificar assinatura do plugin
docker-pilot plugin verify meu-plugin
# Auditoria de seguranƧa
docker-pilot plugin audit meu-plugin
Exemplos PrĆ”ticos¶
Plugin de Integração com Slack¶
// commands/notify.js
module.exports = {
name: 'notify',
description: 'Enviar notificação para Slack',
options: [
{
name: 'message',
alias: 'm',
type: 'string',
description: 'Mensagem para enviar',
required: true
},
{
name: 'channel',
alias: 'c',
type: 'string',
description: 'Canal do Slack'
}
],
async handler(options, context) {
const { message, channel } = options;
const { config, http, logger } = context;
const webhookUrl = config.get('webhook_url');
const defaultChannel = config.get('default_channel');
try {
await http.post(webhookUrl, {
text: message,
channel: channel || defaultChannel
});
logger.info('Notificação enviada com sucesso');
return { success: true };
} catch (error) {
logger.error('Erro ao enviar notificação:', error.message);
return { success: false, error: error.message };
}
}
};
Plugin de Backup Customizado¶
// commands/backup.js
import tar from "tar";
const fs = require('fs').promises;
module.exports = {
name: 'backup',
description: 'Criar backup customizado',
async handler(options, context) {
const { logger, docker, config } = context;
const backupPath = config.get('backup_path') || './backups';
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
const backupFile = `${backupPath}/backup-${timestamp}.tar.gz`;
try {
// Criar diretório de backup
await fs.mkdir(backupPath, { recursive: true });
// Parar serviƧos temporariamente
logger.info('Parando serviƧos...');
await docker.exec('docker-pilot', ['stop', '--all']);
// Criar backup dos volumes
logger.info('Criando backup...');
await tar.create({
gzip: true,
file: backupFile
}, ['./data', './config']);
// Reiniciar serviƧos
logger.info('Reiniciando serviƧos...');
await docker.exec('docker-pilot', ['start', '--all']);
logger.info(`Backup criado: ${backupFile}`);
return { success: true, backup_file: backupFile };
} catch (error) {
logger.error('Erro no backup:', error.message);
return { success: false, error: error.message };
}
}
};
Contribuindo¶
Como Contribuir¶
- Fork o repositório
- Criar branch para feature
- Desenvolver plugin
- Escrever testes
- Documentar plugin
- Enviar pull request
Diretrizes¶
- Seguir padrões de código
- Incluir testes unitƔrios
- Documentar adequadamente
- Usar semantic versioning
- Suportar i18n quando aplicƔvel
Templates¶
O Docker Pilot fornece templates para diferentes tipos de plugins:
# Criar plugin a partir de template
docker-pilot plugin create --template command meu-comando
docker-pilot plugin create --template integration minha-integracao
docker-pilot plugin create --template monitoring meu-monitor