VSCode DevContainer lädt falsche .zshrc und schreibt History in /tmp

Wer mit Visual Studio Code DevContainern arbeitet und zsh als Standardshell nutzt, kann auf ein ärgerliches Problem stoßen: Statt die gewohnte ~/.zshrc zu laden und die History in ~/.zsh_history zu speichern, verwendet VSCode plötzlich ein temporäres Verzeichnis, etwa /tmp/xyz-code-zsh/.zsh_history. Damit gehen wichtige Shell-Einstellungen verloren und die History ist nicht mehr persistent.

Ursache

VSCode setzt beim Starten eines DevContainers die Variable ZDOTDIR auf ein temporäres Verzeichnis. Da zsh seine Konfigurationsdateien standardmäßig in $ZDOTDIR sucht, werden nicht mehr die Dateien im Home-Verzeichnis geladen, sondern eben die im temporären Pfad. Folglich greift auch die falsche History-Datei.

Lösung

Die einfachste und robusteste Lösung besteht darin, systemweit zu erzwingen, dass zsh immer die .zshrc aus dem Home-Verzeichnis lädt. Dazu wird die Datei /etc/zsh/zshenv angepasst, denn sie wird immer als erstes geladen – noch bevor ZDOTDIR berücksichtigt wird.

zsh
# /etc/zsh/zshenv

# Immer $HOME für ZDOTDIR verwenden
export ZDOTDIR="$HOME"

# Bei interaktiven Shells die Home-.zshrc laden
if [[ -o interactive ]] && [[ -r "$HOME/.zshrc" ]] && [[ -z "$__HOME_ZSHRC_SOURCED" ]]; then
  export __HOME_ZSHRC_SOURCED=1
  source "$HOME/.zshrc"
fi

Damit wird unabhängig von VSCode immer die richtige Konfiguration aus /home/<user>/.zshrc geladen. Auch die History landet wieder zuverlässig in ~/.zsh_history.

Dockerfile-Integration

Wer eigene DevContainer-Images baut, sollte den Fix gleich im Dockerfile verankern. So ist das Verhalten reproduzierbar und funktioniert auch nach einem Neuaufsetzen des Containers.

zsh
RUN printf '%s\n' \
  '# Always use $HOME for zsh config (override VS Code tmp ZDOTDIR)' \
  'export ZDOTDIR="$HOME"' \
  '' \
  '# Load user ~/.zshrc for interactive shells (avoid double-sourcing)' \
  'if [[ -o interactive ]] && [[ -r "$HOME/.zshrc" ]] && [[ -z "$__HOME_ZSHRC_SOURCED" ]]; then' \
  '  export __HOME_ZSHRC_SOURCED=1' \
  '  source "$HOME/.zshrc"' \
  'fi' \
  >> /etc/zsh/zshenv

Fazit

Das Problem mit der falschen .zshrc und der temporären History-Datei tritt in vielen DevContainer-Umgebungen auf, wenn VSCode ZDOTDIR auf ein eigenes Verzeichnis setzt. Mit einem kleinen Patch in /etc/zsh/zshenv lässt sich dieses Verhalten dauerhaft korrigieren. So bleiben die gewohnten zsh-Einstellungen und die Shell-History auch in DevContainern konsistent erhalten.

Troubleshooting

Um sicherzustellen, dass der Patch in /etc/zsh/zshenv korrekt greift, lassen sich die wichtigsten Variablen direkt abfragen. Öffne ein Terminal im DevContainer und führe folgende Befehle aus:

zsh
# Zeigt, wo zsh seine Konfigurationsdateien sucht
echo $ZDOTDIR

# Erwartet: /home/<user>

# Prüft, welche History-Datei tatsächlich verwendet wird
echo $HISTFILE

# Erwartet: /home/<user>/.zsh_history

# Testlauf: neue interaktive Shell starten und Variablen prüfen
zsh -ilc 'echo "ZDOTDIR=$ZDOTDIR  HISTFILE=$HISTFILE"'

# Erwartet: ZDOTDIR=/home/<user>  HISTFILE=/home/<user>/.zsh_history

Wenn die Ausgaben wie erwartet aussehen, lädt zsh nun zuverlässig die eigene .zshrc und schreibt die History wieder ins Home-Verzeichnis.

Kommentare

Schreibe einen Kommentar