APKO
O módulo APKO fornece uma interface para trabalhar com a ferramenta APKO (Alpine Package Keeper Orchestrator), permitindo a criação de imagens de container otimizadas e seguras baseadas em Alpine Linux.
Features
- Criação de imagens Alpine
- Gerenciamento de pacotes
- Configuração de imagem
- Suporte a multi-arquitetura
- Otimização de tamanho
- Segurança aprimorada
- Reprodutibilidade
- Integração com registries
Instalação
Para usar o módulo APKO em seu pipeline Dagger:
import (
"dagger.io/dagger"
"github.com/felipepimentel/daggerverse/essentials/apko"
)
Exemplos de Uso
Imagem Básica
func (m *MyModule) BasicImage(ctx context.Context) (*Container, error) {
apko := dag.APKO().
WithPackages([]string{"python3", "git"})
// Criar imagem
return apko.Build(ctx)
}
Configuração Personalizada
func (m *MyModule) CustomConfig(ctx context.Context) (*Container, error) {
apko := dag.APKO().
WithPackages([]string{"python3", "nodejs"}).
WithEnv(map[string]string{
"PYTHON_PATH": "/usr/lib/python3.9",
"NODE_ENV": "production",
}).
WithUser("nonroot")
// Criar imagem com configuração personalizada
return apko.Build(ctx)
}
Multi-arquitetura
func (m *MyModule) MultiArch(ctx context.Context) error {
apko := dag.APKO().
WithPackages([]string{"python3"}).
WithPlatforms([]string{
"linux/amd64",
"linux/arm64",
})
// Construir para múltiplas arquiteturas
return apko.BuildAll(ctx)
}
Integração com GitHub Actions
Exemplo de workflow usando o módulo:
name: APKO Build
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build with APKO
uses: dagger/dagger-action@v1
with:
module: github.com/felipepimentel/daggerverse/essentials/apko
args: |
do -p '
apko := APKO().
WithPackages(["python3", "git"]).
WithUser("nonroot")
apko.Build(ctx)
'
Referência da API
APKO
Estrutura principal que fornece acesso à funcionalidade do APKO.
Construtor
New() *APKO
- Cria uma nova instância do APKO
Métodos de Configuração
WithPackages(packages []string) *APKO
- Define pacotes a serem instalados
- Parâmetro:
packages
: Lista de pacotes
WithEnv(env map[string]string) *APKO
- Define variáveis de ambiente
- Parâmetro:
env
: Mapa de variáveis
WithUser(user string) *APKO
- Define usuário da imagem
- Parâmetro:
user
: Nome do usuário
WithPlatforms(platforms []string) *APKO
- Define plataformas alvo
- Parâmetro:
platforms
: Lista de plataformas
WithConfig(config *File) *APKO
- Define arquivo de configuração
- Parâmetro:
config
: Arquivo de configuração APKO
Métodos de Operação
Build(ctx context.Context) (*Container, error)
- Constrói imagem para plataforma padrão
- Retorna container e erro
BuildAll(ctx context.Context) error
- Constrói imagens para todas plataformas
- Retorna erro se falhar
Push(ctx context.Context, ref string) error
- Publica imagem em registry
- Parâmetros:
ref
: Referência da imagem
- Retorna erro se falhar
Boas Práticas
- Otimização
- Minimize número de pacotes
- Use camadas eficientemente
- Limpe caches
- Segurança
- Use usuário não-root
- Mantenha pacotes atualizados
- Siga princípio do menor privilégio
- Multi-arquitetura
- Teste em todas plataformas
- Valide compatibilidade
- Otimize para cada arquitetura
- Reprodutibilidade
- Use versões específicas
- Documente configurações
- Mantenha builds determinísticos
Solução de Problemas
Problemas comuns e soluções:
- Erro de Build
Erro: Failed to build image Solução: Verifique configuração e dependências
- Erro de Pacote
Erro: Package not found Solução: Verifique repositórios e nome do pacote
- Erro de Plataforma
Erro: Unsupported platform Solução: Verifique suporte à arquitetura
Exemplo de Configuração
# apko.yaml
contents:
repositories:
- https://dl-cdn.alpinelinux.org/alpine/edge/main
- https://dl-cdn.alpinelinux.org/alpine/edge/community
packages:
- python3
- nodejs
- git
- curl
environment:
PYTHON_PATH: /usr/lib/python3.9
NODE_ENV: production
accounts:
groups:
- nonroot
users:
- name: nonroot
uid: 65532
entrypoint:
command: /bin/sh
cmd: -c
archs:
- x86_64
- aarch64
Uso Avançado
Pipeline Completo
func (m *MyModule) CompletePipeline(ctx context.Context) error {
// Configurar APKO
apko := dag.APKO().
WithPackages([]string{
"python3",
"nodejs",
"git",
}).
WithEnv(map[string]string{
"PYTHON_PATH": "/usr/lib/python3.9",
"NODE_ENV": "production",
}).
WithUser("nonroot").
WithPlatforms([]string{
"linux/amd64",
"linux/arm64",
})
// Construir imagens
if err := apko.BuildAll(ctx); err != nil {
return err
}
// Publicar imagens
return apko.Push(ctx, "registry.example.com/app:latest")
}
Configuração Avançada
```go func (m MyModule) AdvancedConfig(ctx context.Context) (Container, error) { // Criar arquivo de configuração config := ` contents: repositories: - https://dl-cdn.alpinelinux.org/alpine/edge/main - https://dl-cdn.alpinelinux.org/alpine/edge/community
packages:
- python3
- python3-dev
- build-base
- git
environment:
PYTHON_PATH: /usr/lib/python3.9
PYTHONUNBUFFERED: "1"
accounts:
groups:
- nonroot
users:
- name: nonroot
uid: 65532
entrypoint:
command: /usr/bin/python3
`
// Configurar APKO com arquivo
apko := dag.APKO().
WithConfig(dag.File("apko.yaml", config))
// Construir imagem
return apko.Build(ctx) }