Artículos

Los 3 problemas al iniciar Claude Code por primera vez en un contenedor Docker

Un agente Claude Code nuevo en un contenedor se detiene ante tres preguntas sucesivas: la bienvenida, la confianza en el directorio y la confirmación de la clave de API. En un terminal desatendido esto bloquea el proceso, por lo que deben inyectarse previamente en su archivo de configuración.

Un agente que muestra un banner y se queda esperando sigue generando bytes, lo que en los registros parece un éxito. En un contenedor nuevo, Claude Code se detiene tres veces antes de realizar cualquier trabajo útil.

Three gates in a row. An agent passes the first two and stops at the third.onboardingtrustapi keya fresh container
El orden es estricto. Haber respondido a las dos primeras preguntas no evita el bloqueo en la tercera.

Las tres paradas en orden de aparición

ParadaPregunta formulada
Asistente de primer inicioSelección de estilo de texto y tema
Comprobación de confianza¿Es este un proyecto en el que confías?
Validación de clave de API¿Deseas utilizar esta clave de API?

Resolver solo una o dos de estas paradas permite avanzar al agente pero sigue impidiendo la ejecución del trabajo.

Matriz de mediciones reales

Comportamiento medido con claude 2.1.220 en un entorno HOME limpio:

Configuración inyectadaComportamiento del agente
NingunaBloqueado en el selector de tema
Solo theme en settings.jsonAún bloqueado en el selector de tema
hasCompletedOnboarding en .claude.jsonAlcanza el diálogo de confianza
+ hasTrustDialogAccepted en la ruta resueltaLlega al prompt con "Not logged in"
+ ANTHROPIC_API_KEY en el entornoBloqueado en "¿Deseas utilizar esta clave de API?"
+ customApiKeyResponses.approvedAlcanza el prompt listo para operar

La trampa de la ruta resuelta

La confianza se almacena bajo projects[ruta] y la ruta debe estar completamente resuelta (canonical). En macOS, las carpetas temporales requieren resolver los enlaces simbólicos para que la CLI reconozca la autorización.

export function trustKeyFor(root: string): string {
  try {
    return realpathSync(root);
  } catch {
    return root;
  }
}

La aprobación de la clave

La confirmación de la clave de API es peligrosa porque su opción por defecto es 2. No (recommended). La CLI almacena únicamente los últimos veinte caracteres como token de aprobación.

export function approvalTokenFor(apiKey: string): string {
  return apiKey.slice(-20);
}

Dos atajos que no funcionan

El modificador --permission-mode bypassPermissions no salta el diálogo de confianza del directorio.

Un tema visual es una preferencia. Borrar un archivo es una decisión crítica.

Preconfiguramos la confianza del entorno pero mantenemos intactas las protecciones sobre herramientas sensibles.

const trust: ProjectTrust = {
  hasTrustDialogAccepted: true,
  hasCompletedProjectOnboarding: true,
  projectOnboardingSeenCount: 0,
  allowedTools: [],
};

El funcionamiento en la nube se detalla en ejecutar Claude Code en la nube, y el control de conexión en observar un terminal remoto.

Respuestas directas

¿Por qué se bloquea Claude Code al iniciar en un contenedor?

Porque espera respuestas interactivas a la selección de tema, la confianza en la carpeta y la confirmación de la clave de API.

¿Cómo se ejecuta Claude Code de forma no interactiva?

Escribiendo el estado de onboarding y la confianza en ~/.claude.json antes del inicio e inyectando las credenciales en el entorno.

¿Cómo se midieron estos datos?

A través de una pty real con la versión 2.1.220 de Claude Code analizando los archivos generados por la CLI.