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
| Requisito | Por quê |
|---|---|
| Processo HTTP de longa duração | O container precisa continuar rodando para atender requisições |
Escutar em 0.0.0.0 | Conexões chegam de fora do container |
| Porta igual ao campo Porta | Qualquer porta funciona, inclusive 80 |
| Configuração por variáveis de ambiente | Segredos e URLs mudam sem reconstruir a imagem |
| Tags versionadas | 1.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
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"]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
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 bootJare o caminho porbuild/libs/*.jar. - O Spring Boot escuta em
8080por padrão. Para mudar, use a variávelSERVER_PORT. -XX:MaxRAMPercentage=75faz 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_USERNAMEeSPRING_DATASOURCE_PASSWORD. A URL usa o formato JDBC, comojdbc:postgresql://host:5432/banco. - Com o Actuator, use
/actuator/healthcomo caminho do health check.
Laravel
A imagem serversideup/php já traz PHP-FPM e NGINX e escuta em 8080:
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 8080Com AUTORUN_ENABLED=true, a imagem executa php artisan migrate --force e os caches de configuração, rotas e views ao iniciar.
| Variável | Valor |
|---|---|
APP_KEY | Saída de php artisan key:generate --show |
APP_ENV | production |
APP_DEBUG | false |
APP_URL | https://seu-projeto.clients.zenifra.com ou seu domínio |
DB_CONNECTION, DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD | Dados 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
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.0Mac 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:
- Criar Projeto → Imagem OCI.
- Informe
ghcr.io/sua-org/minha-api:1.0.0. - Se a imagem for privada, configure as credenciais em Registry privado.
- 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/healthSe a imagem responde localmente com as mesmas variáveis do projeto, ela vai responder na Zenifra.
Problemas comuns
| Sintoma | Correção |
|---|---|
exec format error | Imagem construída para ARM. Use --platform linux/amd64 |
permission denied ao gravar arquivos | Dê ao usuário da imagem permissão na pasta ou use /tmp |
| Projeto não puxa a imagem | Tag inexistente ou registry privado sem credenciais |
| JVM encerrada por falta de memória | Use -XX:MaxRAMPercentage ou um plano maior |
Próximos passos
Última atualização em
Publicar Django na Zenifra
Publique Django na Zenifra com gunicorn, arquivos estáticos via WhiteNoise, ALLOWED_HOSTS, CSRF, HTTPS atrás de proxy, migrations e banco gerenciado.
Guia do console
Aprenda a começar a usar a Zenifra — crie seu primeiro projeto, ajuste as configurações e implante sua aplicação.