Guias por framework

Dockerfiles prontos para Go, Java, PHP e .NET

Linguagens fora de Node.js e Python são publicadas como Imagem OCI. Esta página traz Dockerfiles prontos que seguem os requisitos da Zenifra, além dos comandos para construir e publicar a imagem.

Requisitos de toda imagem

RequisitoPor quê
Processo HTTP de longa duraçãoO container precisa continuar rodando para atender requisições
Escutar em 0.0.0.0Conexões chegam de fora do container
Porta igual ao campo PortaQualquer porta funciona, inclusive 80
Configuração por variáveis de ambienteSegredos e URLs mudam sem reconstruir a imagem
Tags versionadas1.4.2 ou o SHA do commit facilitam rollback; evite latest

Imagens que rodam como root e escutam em portas baixas, como 80, funcionam normalmente. Os exemplos abaixo usam um usuário sem privilégios por ser uma boa prática de segurança, não uma exigência, e escutam na porta 8080. Configure o campo Porta do projeto com o mesmo valor.

Go

Dockerfile
FROM golang:1.23 AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o /app ./cmd/server

FROM gcr.io/distroless/static-debian12:nonroot
COPY --from=build /app /app
EXPOSE 8080
ENTRYPOINT ["/app"]
Escutando na porta
port := os.Getenv("PORT")
if port == "" {
    port = "8080"
}
log.Fatal(http.ListenAndServe(":"+port, mux))

Ajuste ./cmd/server para o pacote main do seu projeto. A imagem distroless contém só o binário, sem shell, o que deixa a imagem pequena e com menos superfície de ataque.

Spring Boot

Dockerfile
FROM eclipse-temurin:21-jdk AS build
WORKDIR /src
COPY . .
RUN ./mvnw -q -DskipTests package && cp target/*.jar /app.jar

FROM eclipse-temurin:21-jre
RUN useradd --system --uid 10001 app
COPY --from=build /app.jar /app/app.jar
USER 10001
EXPOSE 8080
ENTRYPOINT ["java", "-XX:MaxRAMPercentage=75", "-jar", "/app/app.jar"]
  • Com Gradle, troque o comando por ./gradlew bootJar e o caminho por build/libs/*.jar.
  • O Spring Boot escuta em 8080 por padrão. Para mudar, use a variável SERVER_PORT.
  • -XX:MaxRAMPercentage=75 faz a JVM respeitar a memória do plano em vez de tentar usar a memória do servidor inteiro.
  • Configure o banco com SPRING_DATASOURCE_URL, SPRING_DATASOURCE_USERNAME e SPRING_DATASOURCE_PASSWORD. A URL usa o formato JDBC, como jdbc:postgresql://host:5432/banco.
  • Com o Actuator, use /actuator/health como caminho do health check.

Laravel

A imagem serversideup/php já traz PHP-FPM e NGINX e escuta em 8080:

Dockerfile
FROM serversideup/php:8.3-fpm-nginx
WORKDIR /var/www/html
COPY --chown=www-data:www-data . .
RUN composer install --no-dev --optimize-autoloader --no-interaction
ENV AUTORUN_ENABLED=true
EXPOSE 8080

Com AUTORUN_ENABLED=true, a imagem executa php artisan migrate --force e os caches de configuração, rotas e views ao iniciar.

VariávelValor
APP_KEYSaída de php artisan key:generate --show
APP_ENVproduction
APP_DEBUGfalse
APP_URLhttps://seu-projeto.clients.zenifra.com ou seu domínio
DB_CONNECTION, DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORDDados do banco gerenciado

Para que o Laravel gere URLs https, configure trustProxies(at: '*') em bootstrap/app.php. Se o front-end usa Vite, adicione uma etapa com Node.js para rodar npm ci && npm run build antes da imagem final.

Arquivos em storage/app somem a cada publicação. Use armazenamento persistente com o diretório /var/www/html/storage/app ou um serviço de armazenamento de objetos.

ASP.NET Core

Dockerfile
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY *.csproj ./
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /out --no-restore

FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /out .
USER $APP_UID
EXPOSE 8080
ENTRYPOINT ["dotnet", "MinhaApi.dll"]

As imagens .NET 8 escutam em 8080 por padrão e já incluem um usuário sem privilégios ($APP_UID). Troque MinhaApi.dll pelo nome do seu projeto. Connection strings usam variáveis como ConnectionStrings__Default.

Publicar a imagem

Construa a imagem para linux/amd64 e publique em um registry. Exemplo com GitHub Container Registry:

echo $GITHUB_TOKEN | docker login ghcr.io -u SEU_USUARIO --password-stdin
docker build --platform linux/amd64 -t ghcr.io/sua-org/minha-api:1.0.0 .
docker push ghcr.io/sua-org/minha-api:1.0.0

Mac com Apple Silicon

Sem --platform linux/amd64, o Docker em Macs M1/M2/M3 gera uma imagem ARM, que não inicia na Zenifra.

Depois, no console:

  1. Criar Projeto → Imagem OCI.
  2. Informe ghcr.io/sua-org/minha-api:1.0.0.
  3. Se a imagem for privada, configure as credenciais em Registry privado.
  4. Porta 8080, variáveis e plano.

Para automatizar build, push e publicação, use o GitHub Actions da Zenifra.

Teste a imagem localmente antes

docker run --rm -p 8080:8080 -e PORT=8080 ghcr.io/sua-org/minha-api:1.0.0
curl http://localhost:8080/health

Se a imagem responde localmente com as mesmas variáveis do projeto, ela vai responder na Zenifra.

Problemas comuns

SintomaCorreção
exec format errorImagem construída para ARM. Use --platform linux/amd64
permission denied ao gravar arquivosDê ao usuário da imagem permissão na pasta ou use /tmp
Projeto não puxa a imagemTag inexistente ou registry privado sem credenciais
JVM encerrada por falta de memóriaUse -XX:MaxRAMPercentage ou um plano maior

Próximos passos

Última atualização em

Nessa página