fix: remove explicit root User from agent container config#79
fix: remove explicit root User from agent container config#79marianomb82 wants to merge 1 commit into
Conversation
AgentCrew was launching agent containers with User: '0:0' (root). Claude Code 2.1.92+ blocks --dangerously-skip-permissions when running as root, causing agents to exit silently with code 0 and no output. The entrypoint.sh already handles user switching via gosu by detecting the workspace owner uid. Removing the explicit User field lets the entrypoint manage privileges correctly, making Claude Code 2.1.92+ work without downgrading or workarounds. Fixes: silent exit 0 with no stdout when using Claude Code 2.1.92+
barckcode
left a comment
There was a problem hiding this comment.
La PR no resuelve el problema — se necesita un enfoque diferente
Hola! He revisado la PR en detalle y el bug report, y el cambio propuesto no modifica el comportamiento real del container. Te explico por qué:
Por qué quitar User: "0:0" no cambia nada
El Dockerfile base (build/agent/Dockerfile) no tiene directiva USER, lo que significa que Docker siempre arranca el container como root (UID 0) por defecto. Quitar User: "0:0" del código Go simplemente elimina una declaración explícita de algo que ya es el default:
Con User: "0:0" |
Sin User: "0:0" |
|---|---|
| Container arranca como root (explícito) | Container arranca como root (default del Dockerfile) |
| entrypoint.sh detecta root → gosu → non-root | entrypoint.sh detecta root → gosu → non-root |
El flujo es idéntico en ambos casos. El entrypoint.sh siempre entra en la rama if [ "$(id -u)" = "0" ] y ejecuta gosu para hacer drop de privilegios.
Esto también aplica a imágenes custom basadas en la imagen base, ya que la documentación indica que no se necesitan directivas USER en los Dockerfiles custom.
El Problema 2 del bug report no es un bug separado
Revisé todo el pipeline del sidecar (ParseStreamOutput → m.events → convertEvents → c.events → forwardEvents → processEvent → publishLeaderResponse) y funciona correctamente. El canal no se cierra entre mensajes por diseño — se reutiliza entre múltiples llamadas a SendInput.
El "Problema 2" es consecuencia del Problema 1: si Claude Code sale silenciosamente sin producir output (porque detecta root), no hay eventos para que el sidecar procese → la UI queda en "Thinking..." para siempre.
Fix propuesto: anclar Claude Code a 2.1.90
En vez de intentar resolver la detección de root (que probablemente involucra variables de entorno como $HOME o $USER después del gosu), la solución más pragmática es anclar la versión de Claude Code en el Dockerfile:
# En build/agent/Dockerfile, línea 22:
# Antes:
RUN npm install -g @anthropic-ai/claude-code skills
# Después:
RUN npm install -g @anthropic-ai/claude-code@2.1.90 skillsEsto evita el breaking change de 2.1.92+ que bloquea --dangerously-skip-permissions como root, sin necesidad de tocar el entrypoint ni el código Go.
Acción solicitada
¿Podrías reemplazar el cambio de esta PR por el pin de versión en el Dockerfile? Si prefieres, también puedes incluir la eliminación de User: "0:0" como limpieza (es código innecesario), pero el fix real es el pin de versión.
Gracias por el bug report detallado — fue muy útil para diagnosticar el problema!
AgentCrew was launching agent containers with User: '0:0' (root). Claude Code 2.1.92+ blocks --dangerously-skip-permissions when running as root, causing agents to exit silently with code 0 and no output.
The entrypoint.sh already handles user switching via gosu by detecting the workspace owner uid. Removing the explicit User field lets the entrypoint manage privileges correctly, making Claude Code 2.1.92+ work without downgrading or workarounds.
Fixes: silent exit 0 with no stdout when using Claude Code 2.1.92+