Tutorial: Claude Code y Container Use
En Pigmalion Software, la innovación tecnológica es parte de nuestro ADN. Por eso, compartimos este tutorial creado por Ernesto Ponce, uno de nuestros programadores líderes, reconocido por su experiencia en el desarrollo de soluciones ágiles y en la integración de herramientas de inteligencia artificial en entornos productivos.

Ernesto Ponce, Desarrollador líder en Pigmalion Software
Este es un tutorial en el cual vamos a ver un ejemplo paso a paso de cómo utiliza Claude Code en conjunto con contenedores (container-use), para poder ejecutar tareas en background que se estén ejecutando en un contenedor en un nuevo branch en Git. Un recurso imprescindible para equipos que buscan optimizar sus flujos de desarrollo, experimentar en entornos aislados y acelerar la entrega de nuevas funcionalidades.
- Setup Claude Code
- Crear proyecto API Go
- Uso de Claude Code
- Instalación de Container Use
- Ejemplo de tarea en background container
Setup Claude Code
Requisitos Previos
Como primer paso necesitamos tener Node.js instalado en nuestra máquina y ejecutar este comando:
npm install -g @anthropic-ai/claude-code
Configuración Inicial
mkdir claude-code-example && cd claude-code-example
Ejecutamos Claude:claude
Nos va a pedir permisos, presionamos en Yes.
Opciones de Autenticación
- Suscripción en Claude
- Anthropic Account Console
En caso de tener una cuenta en Claude ya estariamos listos al elegir la primera opcion. De otro, tienen que seleccionar la segunda opción, en la cual Claude Code se va a encargar de configurar un acceso ApiKey automaticamente en nuestra cuenta.
Configuración Manual de API Key (Opcional)
- Ir a la siguiente carpeta:
cd ~/.claude
- Crear o modificar el archivo
settings.jsoncon lo siguiente:
{
"apiKeyHelper": "~/.claude/anthropic_key.sh"
}
- Crear el script:
nano anthropic_key.sh- Agregar la API Key:
echo "sk-..."Agregar permiso de ejecucion al script
chmod +x anthropic_key.sh
Una vez configurado nuestro ApiKey o cuenta, podemos acceder a Claude Code.

Crear proyecto API go.
En la carpeta creada anteriormente, claude-code-example, agregamos estos dos archivos.
go.mod
module goapi
go 1.23
main.go
package main
import (
"encoding/json"
"net/http"
)
type Response struct {
Message string `json:"message"`
}
func helloHandler(w http.ResponseWriter, r *http.Request) {
response := Response{Message: "Hello World"}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(response)
}
func main() {
http.HandleFunc("/hello", helloHandler)
http.ListenAndServe(":8080", nil)
}
Ejecutar el servicio de esta manera:
go run main.goProbamos que este todo Ok usando Curl via terminal:
curl http://localhost:8080/helloInicializar git (necesario para usar container-use)
git init
git add .
git commit -m "Initial commit"Uso de Claude Code
Dentro de Claude Code, ejecutar lo siguiente.
/initDurante la ejecución de este comando, Claude Code les va a pedir permiso para ejecutar diferentes herramientas.
Vamos a ver un ejemplo de como sería el uso de Claude Code desde la terminal, realizando cambios en nuestro branch actual.
Le pedimos claude que nos genere un endpoint que retorne la version actual de la API.
claude "Crea un endpoint que retorne la version de la API, la version se define en un archivo llamado version.json"
A medida que se va generado el codigo, claude nos va mostrando los cambios que va realizando y la opcion de aceptar o modificar los cambios.
Este sería un flujo de uso básico de Claude Code, en donde vamos viendo los cambios de manera incremental y podemos aceptar o modificar los cambios que nos propone en el momento, lo cual sería algo similar a lo que se puede hacer con Copilot, Cursor o Windsurf pero desde la terminal.
En el próximo paso vamos a ver como podemos usar Claude Code para ejecutar tareas en background.
Claude code con Container use
Pero de que manera podriamos delegar una tarea a Claude Code en nuestar maquina sin que afecte a nuestro branch o carpeta acutal en la que necesitemos trabajar en otras tareas?
Para esto podemos utilizar contenedores, los cuales nos permiten tener un entorno aislado para ejecutar tareas, probar ideas, librerías, refactors, etc.
vamos a utilizar un proyecto llamado container-use, el cual esta desarrollado por el equipo creador de Docker y posteriormente de Dagger.
Instalación de Container Use
curl -fsSL https://raw.githubusercontent.com/dagger/container-use/main/install.sh | bash
Una vez instalado cu, tenemos que configurar Claude Code para que utilice el servicio MCP de cu.
Más información sobre MCP: Model Context Protocol
en la carpeta del proyecto ejecutamos el siguiente comando:
claude mcp add container-use -- cu stdio
Agregar reglas de container use a CLAUDE.md
curl https://raw.githubusercontent.com/dagger/container-use/main/rules/agent.md >> CLAUDE.md
Crear tarea en background con container use
Una vez configurado container-user vamos a probar lo siguiente:
- Crear tarea en background con container use, Claude Code
- Revisar cambios realizados por claude code
- Merger los cambios al branch principal
Vamos a pedirle a Claude Code que genere tests para los endpoints de nuestra API y además agregue una carpeta para los handlers/controladores de la API.
claude "Crea tests para los endpoints de la API y agrega una carpeta llamada controllers para los handlers de los endpoints, usa container-use MCP"
Claude va a empezar una nueva sesión, con la diferencia de que esta vez va a utilizar el MCP cu (container-use) para ejecutar los cambios en un contenedor. A medida que va ir avanzando, nos va a pedir permismo para ejecutar diferentes tools.
Selecciones la segunda opción «Yes, and don’t ask again for container-use:environment_create», de esta menera en las próximas tareas ya no nos va a aparecer este mensaje.
Podemos ver cuales son los branchs creados por container user, con el siguiente comando:
cu list
ID TITLE CREATED UPDATED
devoted-squirrel Go API Testing and Refactoring 5 minutes ago 11 seconds ago
Podemos ver los cambios realizados vía terminal
cu logs
Debido a que container-use genera un nuevo branch, también podemos ver los cambios haciendo un checkout al branch correspondiente:

A medida que se va generado el código, Claude Code nos va mostrando los cambios que va realizando y la opcion de aceptar o modificar los cambios, aca debemos elegir la segunda opción para que no vuelva a preguntar en las próximas tareas.
Una vez que estamos conformes con los cambios podemos hacer un merge al branch principal, de esta manera:
cu merge devoted-squirrel main
Resumen
- Configuración inicial de Claude Code, incluyendo autenticación y uso de
claudedesde la terminal. - Creación de una API en Go y uso de Claude Code para agregar endpoints y pruebas de manera incremental.
- Instalación y configuración de Container Use (
cu) para delegar tareas en contenedores. - Ejecución de tareas en background con
cu, incluyendo gestión de branches, visualización de logs y merges.

