Files
fn_registry/functions/infra/generate_dockerfile.go
T
egutierrez 1d45f232c6 feat: funciones infra — Docker, deploy, build y health check
Funciones impuras para gestión de contenedores: docker_build_image,
docker_compose_up/down, docker_volume_create/list/remove,
generate_dockerfile, write_dockerfile, go_build_binary, health_check_http,
deploy_app y stop_app. Todas con tests unitarios donde aplica.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 14:24:12 +02:00

54 lines
1.6 KiB
Go

package infra
import (
"fmt"
"sort"
"strings"
)
// GenerateDockerfile genera el texto de un Dockerfile multi-stage para una app Go.
// Stage build: golang:1.23-alpine — descarga dependencias y compila.
// Stage final: alpine:latest — copia el binario, expone el puerto y lo ejecuta.
// Las envVars se inyectan como instrucciones ENV en el stage final.
// Funcion pura: no realiza I/O, solo genera texto.
func GenerateDockerfile(binaryName string, port int, envVars map[string]string) string {
var sb strings.Builder
// Stage build
sb.WriteString("# Stage build\n")
sb.WriteString("FROM golang:1.23-alpine AS builder\n\n")
sb.WriteString("WORKDIR /app\n\n")
sb.WriteString("COPY go.mod go.sum ./\n")
sb.WriteString("RUN go mod download\n\n")
sb.WriteString("COPY . .\n")
sb.WriteString(fmt.Sprintf("RUN CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags=\"-s -w\" -o %s .\n\n", binaryName))
// Stage final
sb.WriteString("# Stage final\n")
sb.WriteString("FROM alpine:latest\n\n")
sb.WriteString("RUN apk --no-cache add ca-certificates tzdata\n\n")
sb.WriteString("WORKDIR /app\n\n")
sb.WriteString(fmt.Sprintf("COPY --from=builder /app/%s .\n\n", binaryName))
// ENV vars (orden determinista)
if len(envVars) > 0 {
keys := make([]string, 0, len(envVars))
for k := range envVars {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
sb.WriteString(fmt.Sprintf("ENV %s=%s\n", k, envVars[k]))
}
sb.WriteString("\n")
}
if port > 0 {
sb.WriteString(fmt.Sprintf("EXPOSE %d\n\n", port))
}
sb.WriteString(fmt.Sprintf("ENTRYPOINT [\"./%s\"]\n", binaryName))
return sb.String()
}