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

56 lines
4.7 KiB
Markdown

# 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](Dockerfile#L179-L189)) 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](Dockerfile#L179-L189), 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):
```dockerfile
# /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.