Deploy de uma imagem
Em vez de enviar o código pra build, você pode apontar o GoShip pra uma imagem de container que já existe:
goship deploy --image ghcr.io/minha-org/meu-app@sha256:3f1c… -a meu-appNão precisa do código do projeto, só do que identifica o app: um goship.yaml local (ou as flags --org, --project, --environment, --plan) diz onde o app vive. Se o app ainda não existe, ele é criado sem plataforma (quem define como roda é a imagem) e, como no deploy normal, --plan escolhe o plano.
Quando usar
- Seu CI já constrói e testa a imagem, e você quer subir exatamente aquele artefato.
- O projeto tem um build próprio que o GoShip não precisa repetir.
- Você quer subir uma imagem pública de terceiros.
Pra o resto, o deploy do diretório continua sendo o caminho mais curto.
O que a imagem precisa ter
- Registry público. Por enquanto o GoShip puxa a imagem sem credenciais, então imagens em registries privados não funcionam.
- Plataforma
linux/amd64. Construa com--platform linux/amd64, principalmente se o CI ou seu computador for ARM. - No máximo 2 GB, somando as camadas da imagem. O limite vale no cluster compartilhado do GoShip; em clusters que você conectou (veja Conectar um cluster Kubernetes) não prometemos o mesmo limite por enquanto.
- Prefira o digest (
imagem@sha256:…) a uma tag. Uma tag como:latestpode apontar pra outra imagem amanhã; o digest garante que o que você testou é o que sobe.
--image não combina com --platform nem com --dockerfile: não há build pra configurar.
goship.yaml
O goship.yaml tem duas origens:
- Da imagem (
goship.yamloutsuru.yamldentro dela):healthcheck,hooks,processesekubernetes. Copie o arquivo pra imagem comCOPY goship.yaml ./no Dockerfile. - Do diretório onde você roda o comando (
goship.yamllocal, ou as flags):app,org,project,environment,planeenv.
Se houver um goship.yaml local com healthcheck, hooks, processes ou kubernetes, o GoShip avisa que essas chaves vêm da imagem.
Porta
A porta vem do EXPOSE da imagem. Sem EXPOSE, o app deve escutar na porta da variável $PORT, como nos outros deploys.
Exemplo: GitHub Actions com GHCR
O workflow constrói a imagem, publica no GitHub Container Registry e faz o deploy pelo digest. Um pacote criado no primeiro push ao GHCR nasce privado: antes do primeiro deploy de imagem, torne-o público uma vez (página do pacote → Package settings → visibilidade), porque o GoShip puxa a imagem sem credenciais. Os nomes no GHCR precisam estar em minúsculas, e github.repository_owner mantém a caixa do dono; por isso o primeiro passo grava OWNER já em minúsculas. O token do GoShip fica num secret do repositório (veja Autenticação).
name: deploy
on:
push:
branches: [main]
permissions:
contents: read
packages: write
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Nome da organização em minúsculas
run: echo "OWNER=${GITHUB_REPOSITORY_OWNER,,}" >> "$GITHUB_ENV"
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- id: push
uses: docker/build-push-action@v6
with:
context: .
platforms: linux/amd64
push: true
tags: ghcr.io/${{ env.OWNER }}/meu-app:${{ github.sha }}
- name: Instalar o goship
run: |
mkdir -p "$HOME/bin"
GOSHIP_INSTALL_DIR="$HOME/bin" sh -c "$(curl -fsSL https://goship.sh/install.sh)"
echo "$HOME/bin" >> "$GITHUB_PATH"
- name: Deploy no GoShip
env:
GOSHIP_TOKEN: ${{ secrets.GOSHIP_TOKEN }}
run: |
goship deploy -a meu-app \
--org minha-org --project meu-projeto --environment production \
--image ghcr.io/${{ env.OWNER }}/meu-app@${{ steps.push.outputs.digest }}Num runner não há organização, projeto nem ambiente fixados, então o exemplo os nomeia com --org, --project e --environment (ou use um goship.yaml commitado com org:, project: e environment:). Veja a ordem de escolha em Login, organização, projeto e ambiente. A instalação segue Instalação.
Docker Hub e limites de pull
O Docker Hub limita os pulls anônimos por IP, e o GoShip puxa sem login, então um deploy pode falhar por limite mesmo com a imagem pública. Prefira o GHCR (ou outro registry sem esse limite) pra imagens que você publica pra o GoShip.
Pelo MCP
No servidor MCP, goship_deploy aceita image no lugar de path. Por não precisar ler um diretório, funciona também no servidor MCP hospedado.