From 47b624b70819e87433eeda15f81505b7e691feb9 Mon Sep 17 00:00:00 2001 From: Alejandro Lembke Barrientos Date: Sun, 12 Jul 2026 21:50:45 +0000 Subject: [PATCH] Add user number be agnostic. --- entrypoint.sh | 28 ++++++++++++++++++++++++++-- readme.md | 3 +++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/entrypoint.sh b/entrypoint.sh index a09db63..5021169 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -5,6 +5,13 @@ if [[ -z "${HOME_USER-}" ]]; then HOME_USER="vscode" fi +# Detectar UID/GID del volumen montado en /home/${HOME_USER} (si ya existe), +# permitir override explícito vía HOST_UID/HOST_GID, y por defecto usar 1000. +DETECTED_UID=$(stat -c '%u' "/home/${HOME_USER}" 2>/dev/null || echo 1000) +DETECTED_GID=$(stat -c '%g' "/home/${HOME_USER}" 2>/dev/null || echo 1000) +TARGET_UID="${HOST_UID:-$DETECTED_UID}" +TARGET_GID="${HOST_GID:-$DETECTED_GID}" + if ! grep -q "HOME_USER=" /etc/environment; then sudo bash -c "echo HOME_USER=$HOME_USER >> /etc/environment" fi @@ -66,8 +73,9 @@ do done USER="$HOME_USER" -if ! id -u $HOME_USER > /dev/null 2>&1; then - sudo adduser --disabled-password --gecos "" --uid 1000 ${HOME_USER} +if ! id -u "$HOME_USER" > /dev/null 2>&1; then + sudo groupadd -g "${TARGET_GID}" "${HOME_USER}" 2>/dev/null || true + sudo adduser --disabled-password --gecos "" --uid "${TARGET_UID}" --gid "${TARGET_GID}" "${HOME_USER}" sudo echo "$HOME_USER ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers.d/nopasswd > /dev/null # Creating .vscode folder if it doesn't exist @@ -77,6 +85,22 @@ if ! id -u $HOME_USER > /dev/null 2>&1; then # Changing the property of the directory /home/${HOME_USER}/.vscode sudo chown -R ${HOME_USER} /home/${HOME_USER}/.vscode +else + # Usuario ya existe (imagen/volumen reusado) — resincronizar UID/GID si cambiaron + CURRENT_UID=$(id -u "${HOME_USER}") + CURRENT_GID=$(id -g "${HOME_USER}") + CURRENT_GROUP=$(id -gn "${HOME_USER}") + + if [ "$CURRENT_UID" != "$TARGET_UID" ] || [ "$CURRENT_GID" != "$TARGET_GID" ]; then + if [ "$CURRENT_GID" != "$TARGET_GID" ]; then + sudo groupmod -g "${TARGET_GID}" "${CURRENT_GROUP}" + fi + if [ "$CURRENT_UID" != "$TARGET_UID" ]; then + sudo usermod -u "${TARGET_UID}" "${HOME_USER}" + fi + sudo find / -xdev \( -user "${CURRENT_UID}" -o -group "${CURRENT_GID}" \) \ + -exec chown -h "${TARGET_UID}:${TARGET_GID}" {} + 2>/dev/null || true + fi fi # Then execute entrypoint.sh diff --git a/readme.md b/readme.md index e4e5fda..4e83052 100644 --- a/readme.md +++ b/readme.md @@ -16,6 +16,7 @@ The following environment variables can be set when running the Docker container - `HOME_USER`: The username of the user running the container. This is used to set the correct permissions on files created in the container. - `VSCODE_TUNNEL_NAME`: The name of the SSH tunnel used by Visual Studio Code to connect to the container. +- `HOST_UID` / `HOST_GID` (optional): Force the `HOME_USER` account to use a specific UID/GID instead of the default `1000`. If not set, the container will try to auto-detect the UID/GID from an existing `/home/${HOME_USER}` mount (useful when bind-mounting a host directory owned by a non-1000 user); if that can't be detected either, it falls back to `1000`. If the container is restarted/reused and the UID/GID changed, the existing user is resynced (`usermod`/`groupmod`) and its files re-owned accordingly. ### Custom Environment Variables @@ -175,6 +176,8 @@ RUN echo 'source ~/.nvm/nvm.sh' >> ~/.bashrc > **Note:** If you are using this image as a base image in a Dockerfile, ensure that the value of `HOME_USER` is the same as the one you will use when creating the container. This is necessary to ensure that all configurations and packages are installed in the correct user directory. +> **Note:** The `--uid 1000` in the example above is just illustrative. If you run the final container with `HOST_UID`/`HOST_GID` set (or with `/home/${HOME_USER}` bind-mounted from a host directory owned by another user), `entrypoint.sh` will resync this user's UID/GID at container start. + > **Note:** To grant access to the server, please log into https://github.com/login/device and use the code XXXX-XXXX. You can view the container logs to get the code. ## Contributing