Files
qwen3-6-lora/data/raw/sanitized/plans/mira-dockerfile-el-humming-noodle.md

4.7 KiB

Fix: ls: unparsable value for LS_COLORS environment variable

Context

Al correr el contenedor, cualquier ls imprime ls: unparsable value for LS_COLORS environment variable antes de listar el contenido (funciona, pero con este warning ruidoso).

Comparando las dos capturas de terminal: el archivo que se está evaluando (/usr/bin/.bashrc, targeteado en las líneas 179-189 del Dockerfile) contiene el bloque estándar de Debian/Ubuntu con el export LS_COLORS="rs=0:di=01;34:...:*.xspf=00;36:" heredado de la imagen base (gitea.p-lao.com/aleleba/vscode:latest), y inmediatamente a continuación, sin salto de línea, arranca PATH=/usr/local/sbin:/usr/local/bin:...:/opt/android-sdk/build-tools.

Esto es exactamente el contenido que agrega la línea 180 del Dockerfile:

RUN echo "PATH=$PATH:/opt/android-sdk/cmdline-tools/latest/bin:/opt/android-sdk/platform-tools:/opt/android-sdk/build-tools" | sudo tee -a /usr/bin/.bashrc

Root cause: el archivo /usr/bin/.bashrc que trae la imagen base no termina con salto de línea después del bloque LS_COLORS. Como tee -a solo agrega contenido (no garantiza una línea nueva antes), el primer echo ... | sudo tee -a de nuestro bloque (línea 180) queda pegado al final de esa línea sin separador. Al no haber espacio/salto entre el cierre de comillas de LS_COLORS="..." y PATH=... (adyacentes, sin espacio), bash concatena ambos en una sola asignación de variable, y el valor final de LS_COLORS termina incluyendo literalmente PATH=/usr/local/sbin:...:/opt/android-sdk/build-tools, que no es un valor válido de dircolors → de ahí el error de ls.

Confirmado por un agente Explore: nada en este repo (Dockerfile, README, CI de .gitea/workflows/) fija HOME o crea el symlink hacia /usr/bin/.bashrc — ese detalle vive en la imagen base privada, fuera de este repo. El fix debe vivir en nuestra propia capa, siendo defensivos ante ese archivo heredado sin salto de línea final.

De paso, la línea 180 es inconsistente con el resto del bloque (182-189): le falta la palabra export, mientras que todas las demás sí exportan la variable.

Cambio

En Dockerfile, en el bloque "/usr/bin/.bashrc Configuration":

  1. Agregar un RUN echo | sudo tee -a /usr/bin/.bashrc > /dev/null antes del resto del bloque, para forzar un salto de línea de separación sin importar si el archivo heredado terminaba o no con newline.
  2. Corregir la línea del PATH para que use export igual que las demás (actualmente falta).

Resultado (líneas 179-189 reemplazadas):

# /usr/bin/.bashrc Configuration
# The base image's /usr/bin/.bashrc doesn't end with a trailing newline after its
# LS_COLORS export, so appending directly here used to glue this block onto that
# line and corrupt LS_COLORS (ls: "unparsable value for LS_COLORS environment variable").
RUN echo | sudo tee -a /usr/bin/.bashrc > /dev/null
RUN echo "export PATH=$PATH:/opt/android-sdk/cmdline-tools/latest/bin:/opt/android-sdk/platform-tools:/opt/android-sdk/build-tools" | sudo tee -a /usr/bin/.bashrc
RUN echo "export JAVA_HOME=$JAVA_HOME" | sudo tee -a /usr/bin/.bashrc
RUN echo "export ANDROID_HOME=/opt/android-sdk" | sudo tee -a /usr/bin/.bashrc
RUN echo "export ANDROID_SDK_ROOT=/opt/android-sdk" | sudo tee -a /usr/bin/.bashrc
RUN echo 'export NVM_DIR="/usr/local/nvm"' | sudo tee -a /usr/bin/.bashrc
RUN echo '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"' | sudo tee -a /usr/bin/.bashrc
RUN echo 'nvm use default >/dev/null 2>&1' | sudo tee -a /usr/bin/.bashrc
RUN echo "export EMSDK_QUIET=1" | sudo tee -a /usr/bin/.bashrc
RUN echo "source /emsdk/emsdk_env.sh" | sudo tee -a /usr/bin/.bashrc
RUN echo 'export PATH="$HOME/.local/bin:$PATH"' | sudo tee -a /usr/bin/.bashrc

No se toca nada más del Dockerfile — el resto de las capas (Android SDK, Node, Docker, etc.) no está relacionado con este bug.

Verificación

No se hace build local de la imagen — el pipeline de CI (.gitea/workflows/main-workflow.yml) se encarga de construirla al pushear el cambio.

  1. Pushear el cambio y confirmar que el workflow de CI construye la imagen sin errores.
  2. Levantar un contenedor de la imagen nueva y correr cat /usr/bin/.bashrc (o ~/.bashrc si está symlinkeado): confirmar que el bloque export LS_COLORS=... termina en su propia línea y que export PATH=... arranca en la línea siguiente, no concatenado.
  3. Correr ls en una terminal nueva del contenedor: no debe imprimir unparsable value for LS_COLORS environment variable.
  4. Confirmar que $PATH, $JAVA_HOME, $ANDROID_HOME, etc. siguen resolviendo correctamente (echo $PATH, java -version, sdkmanager --version) ya que ahora PATH se exporta explícitamente.