| #!/bin/sh | |
| # Create the unprivileged user that the container runs as, given its name, | |
| # uid, and gid. See `Help/dev/devcontainer.rst`. | |
| set -e | |
| readonly username="$1" | |
| readonly uid="$2" | |
| readonly gid="$3" | |
| # The base image already ships an unprivileged user, which usually occupies | |
| # the uid we want. Remove whoever holds it, and the group holding our gid, | |
| # before creating ours. | |
| if getent passwd "$uid" > /dev/null; then | |
| userdel --remove "$(getent passwd "$uid" | cut -d: -f1)" | |
| fi | |
| if getent group "$gid" > /dev/null; then | |
| groupdel "$(getent group "$gid" | cut -d: -f1)" | |
| fi | |
| groupadd --gid "$gid" "$username" | |
| useradd --uid "$uid" --gid "$gid" --create-home --shell /bin/bash "$username" | |
| # Let the user administer the container, e.g. to install more packages. | |
| echo "$username ALL=(ALL) NOPASSWD:ALL" > "/etc/sudoers.d/$username" | |
| chmod 0440 "/etc/sudoers.d/$username" | |
| # Pre-create the directories that `devcontainer.json` mounts volumes over so | |
| # that the volumes inherit the ownership recorded here. Name the parents too: | |
| # `install -d` records the ownership only of the directories it is given, and | |
| # tools that write elsewhere under them need to own them as well. | |
| install -d -o "$username" -g "$username" \ | |
| "/home/$username/.cache" \ | |
| "/home/$username/.cache/ccache" \ | |
| "/home/$username/.config" \ | |
| "/home/$username/.config/glab-cli" \ | |
| "/home/$username/workspace" |