Par défaut lorsque vous exécutez
docker run -it [myimage]
OR
docker attach [mycontainer]
vous vous connectez au terminal en tant qu'utilisateur root, mais j'aimerais me connecter en tant qu'utilisateur différent. Est-ce possible?
Pour docker run
:
Ajoutez simplement l'option --user <user>
pour passer à un autre utilisateur lorsque vous démarrez le conteneur de menu fixe.
docker run -it --user nobody busybox
Pour docker attach
ou docker exec
:
Puisque la commande est utilisée pour attacher/exécuter dans le processus existant, elle utilise donc l'utilisateur actuel directement.
docker run -it busybox # CTRL-P/Q to quit
docker attach <container id> # then you have root user
/ # id
uid=0(root) gid=0(root) groups=10(wheel)
docker run -it --user nobody busybox # CTRL-P/Q to quit
docker attach <container id>
/ $ id
uid=99(nobody) gid=99(nogroup)
Si vous voulez vraiment joindre à l’utilisateur que vous voulez avoir, alors
run --user <user>
ou mentionnez-le dans votre Dockerfile
en utilisant USER
Vous pouvez exécuter un shell dans un conteneur docker en cours d’exécution à l’aide d’une commande telle que:
docker exec -it --user root <container id> /bin/bash
Vous pouvez spécifier USER
dans le fichier Docker. Toutes les actions ultérieures seront effectuées à l'aide de ce compte. Vous pouvez spécifier USER
une ligne avant CMD
ou ENTRYPOINT
si vous souhaitez uniquement utiliser cet utilisateur lors du lancement d'un conteneur (et non lors de la création de l'image). Lorsque vous démarrez un conteneur à partir de l'image résultante, vous vous attachez en tant qu'utilisateur spécifié.
Le seul moyen de le faire fonctionner est de:
docker run -it -e USER=$USER -v /etc/passwd:/etc/passwd -v `pwd`:/siem mono bash
su - magnus
Je dois donc spécifier à la fois la variable d’environnement $ USER et le fichier/etc/passwd. De cette façon, je peux compiler dans le dossier/siem et y conserver la propriété des fichiers, pas en tant que root.
Ma solution:
#!/bin/bash
user_cmds="$@"
GID=$(id -g $USER)
UID=$(id -u $USER)
RUN_SCRIPT=$(mktemp -p $(pwd))
(
cat << EOF
addgroup --gid $GID $USER
useradd --no-create-home --home /cmd --gid $GID --uid $UID $USER
cd /cmd
runuser -l $USER -c "${user_cmds}"
EOF
) > $RUN_SCRIPT
trap "rm -rf $RUN_SCRIPT" EXIT
docker run -v $(pwd):/cmd --rm my-docker-image "bash /cmd/$(basename ${RUN_SCRIPT})"
Cela permet à l'utilisateur d'exécuter des commandes arbitraires à l'aide des outils fournis par my-docker-image
. Notez comment le répertoire de travail actuel de l'utilisateur est monté en volumeTo /cmd
à l'intérieur du conteneur.
J'utilise ce flux de travail pour permettre à mon équipe de développement de compiler de manière croisée du code C/C++ pour la cible arm64, dont je tiens le bsp (le my-docker-image
contient le compilateur croisé, sysroot, make, cmake, etc.). Avec cela, un utilisateur peut simplement faire quelque chose comme:
cd /path/to/target_software
cross_compile.sh "mkdir build; cd build; cmake ../; make"
Où cross_compile.sh
est le script ci-dessus. La machine addgroup/useradd
permet à l'utilisateur de posséder tous les fichiers/répertoires créés par la construction.
Bien que cela fonctionne pour nous. Cela semble une sorte de hacky. Je suis ouvert aux implémentations alternatives ...
Exécutez la commande en tant qu'utilisateur www-data: docker exec -t --user www-data container bash -c "ls -la"