Skip to content

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-app

Nã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 :latest pode 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.yaml ou tsuru.yaml dentro dela): healthcheck, hooks, processes e kubernetes. Copie o arquivo pra imagem com COPY goship.yaml ./ no Dockerfile.
  • Do diretório onde você roda o comando (goship.yaml local, ou as flags): app, org, project, environment, plan e env.

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.