---
name: deploy_app
kind: pipeline
lang: go
domain: infra
version: "1.0.0"
purity: impure
signature: "func DeployApp(appDir string, imageName string, port int, envVars map[string]string) (string, error)"
description: "Orquesta el deploy completo de una app Go en Docker. Pasos: genera Dockerfile, lo escribe a disco, construye la imagen y lanza el contenedor en modo detach con port mapping. Retorna el container ID."
tags: [docker, deploy, go, pipeline, infra, container]
uses_functions: [generate_dockerfile_go_infra, write_dockerfile_go_infra, docker_build_image_go_infra, docker_run_container_go_infra]
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [fmt]
params:
  - name: appDir
    desc: "ruta del directorio de la app Go (contiene main.go)"
  - name: imageName
    desc: "nombre de la imagen Docker a construir y contenedor a lanzar"
  - name: port
    desc: "puerto a mapear (hostPort == containerPort)"
  - name: envVars
    desc: "mapa de variables de entorno a pasar al contenedor"
output: "ID del contenedor Docker lanzado exitosamente"
tested: false
tests: []
test_file_path: ""
file_path: "functions/infra/deploy_app.go"
---

## Ejemplo

```go
containerID, err := DeployApp(
    "/home/user/apps/myapp",
    "myapp",
    8080,
    map[string]string{
        "DB_HOST": "postgres",
        "PORT":    "8080",
    },
)
if err != nil {
    log.Fatal(err)
}
fmt.Println("Contenedor lanzado:", containerID)
```

## Notas

Pipeline de 4 pasos: generate_dockerfile (pura) → write_dockerfile → docker_build_image → docker_run_container. El nombre del contenedor e imagen coinciden con imageName. El port mapping es simetrico (hostPort == containerPort). Si cualquier paso falla, el pipeline retorna error con contexto del paso fallido. No hace rollback automatico — para limpiar usar stop_app.
