GitHub Container Registry (GHCR)
GitHub Container Registry (ghcr.io) é o registry de containers integrado ao GitHub — sem limite de pulls, autenticação com o mesmo token do GitHub Actions e visibilidade configurável por package. É a alternativa gratuita e mais conveniente ao Docker Hub para projetos hospedados no GitHub.
Autenticar e fazer push manual no GHCR
Para publicar imagens a partir da máquina local:
bash
# 1. Criar Personal Access Token com permissão write:packages
# github.com → Settings → Developer settings → Tokens → Classic
# Scopes: write:packages, read:packages, delete:packages
# 2. Login no GHCR
echo "SEU_GITHUB_TOKEN" | docker login ghcr.io -u SEU_USUARIO --password-stdin
# 3. Build e tag da imagem
docker build -t ghcr.io/SEU_USUARIO/minha-api:latest .
docker build -t ghcr.io/SEU_USUARIO/minha-api:1.2.3 .
# 4. Push
docker push ghcr.io/SEU_USUARIO/minha-api:latest
docker push ghcr.io/SEU_USUARIO/minha-api:1.2.3
# 5. Ver pacotes publicados:
# github.com/SEU_USUARIO → Packages
# 6. Pull da imagem (requer login se privado)
docker pull ghcr.io/SEU_USUARIO/minha-api:latestConfigurar visibilidade e acesso
Controle quem pode acessar suas imagens:
bash
# GHCR suporta três níveis de visibilidade:
# Public: qualquer um pode fazer pull (sem autenticação)
# Private: apenas usuários autorizados (requer login)
# Internal: apenas membros da organização
# Alterar via interface:
# github.com/SEU_USUARIO → Packages → minha-api → Package settings
# Change package visibility
# Vincular package ao repositório:
# Package settings → Connect Repository → selecionar repo
# Isso habilita herança de permissões do repositório
# Gerenciar via API:
curl -X PATCH \
-H "Authorization: Bearer SEU_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/user/packages/container/minha-api/versions/ID \
-d '{"metadata": {"container": {"tags": ["latest", "stable"]}}}'Usar imagem do GHCR em docker-compose na VPS
Configure a VPS para puxar imagens privadas do GHCR:
yaml
# Na VPS — login permanente no GHCR
# Criar token com apenas read:packages
echo "GITHUB_TOKEN_READONLY" | docker login ghcr.io -u USUARIO --password-stdin
# Verificar que o login foi salvo:
cat ~/.docker/config.json | grep ghcr
# docker-compose.yml na VPS:
services:
app:
image: ghcr.io/usuario/minha-api:main
restart: always
pull_policy: always # sempre verificar nova versão no pull
# Atualizar imagem e reiniciar:
docker compose pull app
docker compose up -d --no-deps app
# Para automação sem armazenar token na VPS:
# No script de deploy chamado pelo GitHub Actions:
# ssh deploy@VPS "echo '$GITHUB_TOKEN' | docker login ghcr.io -u $GITHUB_USER --password-stdin && docker compose pull && docker compose up -d"Limpeza automática de imagens antigas
Mantenha o storage organizado deletando versões antigas:
yaml
# .github/workflows/cleanup-packages.yml
name: Limpar imagens antigas do GHCR
on:
schedule:
- cron: '0 3 * * 0' # todo domingo às 3h
workflow_dispatch:
jobs:
cleanup:
runs-on: ubuntu-latest
permissions:
packages: write
steps:
- name: Deletar versões sem tag (untagged)
uses: actions/delete-package-versions@v5
with:
package-name: 'minha-api'
package-type: 'container'
delete-only-untagged-versions: 'true'
min-versions-to-keep: 0
- name: Manter apenas últimas 10 versões
uses: actions/delete-package-versions@v5
with:
package-name: 'minha-api'
package-type: 'container'
min-versions-to-keep: 10
ignore-versions: '^(latest|main|stable|v\d+\.\d+\.\d+)#x27;Labels e metadata nas imagens
Adicione metadata OCI às imagens para rastreabilidade:
dockerfile
# Dockerfile — labels OCI (padrão da indústria)
FROM node:22-alpine
LABEL org.opencontainers.image.title="Minha API"
LABEL org.opencontainers.image.description="API REST da Minha Aplicação"
LABEL org.opencontainers.image.url="https://github.com/usuario/minha-api"
LABEL org.opencontainers.image.source="https://github.com/usuario/minha-api"
LABEL org.opencontainers.image.licenses="MIT"
# No GitHub Actions — metadata-action adiciona automaticamente:
# org.opencontainers.image.created
# org.opencontainers.image.revision (git sha)
# org.opencontainers.image.version
# Verificar labels de uma imagem:
docker inspect ghcr.io/usuario/minha-api:latest | \
python3 -m json.tool | grep -A 20 '"Labels"'$ runstack deploy --plan starter
Não quer configurar manualmente?
Não quer configurar manualmente? Implante o VPS em menos de 3 minutos com a Runstack. Infraestrutura da OPEN DATACENTER, com servidores no Brasil.