Se connecter au conteneur docker en tant qu'utilisateur autre que root
6 réponses
docker run
:
il suffit d'ajouter l'option --user <user>
pour passer à un autre utilisateur lorsque vous démarrez le conteneur docker.
docker run -it --user nobody busybox
docker attach
ou docker exec
:
puisque la commande est utilisée pour attacher/exécuter dans le processus existant, elle utilise donc directement l'utilisateur courant.
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 vous joindre à l'utilisateur que vous souhaitez avoir, alors
- démarrer avec cet utilisateur
run --user <user>
ou le mentionner dans votreDockerfile
en utilisantUSER
- changer l'utilisateur en utilisant ' su
Vous pouvez exécuter un shell dans un conteneur Docker en cours d'exécution en utilisant une commande comme:
docker exec -it --user root <container id> /bin/bash
Vous pouvez spécifier USER
dans le Dockerfile. Toutes les actions subséquentes seront effectuées à l'aide de ce compte. Vous pouvez spécifier USER
une ligne avant la balise CMD
ou ENTRYPOINT
si vous voulez seulement utiliser cet utilisateur lors du lancement d'un conteneur (et pas lors de la construction de l'image). Lorsque vous démarrez un conteneur à partir de l'image résultante, vous vous attacherez en tant qu'utilisateur spécifié.
La seule façon que je peux faire c'est:
docker run -it -e USER=$USER -v /etc/passwd:/etc/passwd -v `pwd`:/siem mono bash
su - magnus
donc je dois à la fois spécifier $USER environment variable ainsi qu'un point le fichier /etc/passwd. De cette façon, je peux compiler in /Siem folder et conserver la propriété des fichiers qui n'y sont pas 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 en utilisant les outils fournit par my-docker-image
. Note comment le répertoire de travail courant de l'utilisateur est monté sur le volume
/cmd
à l'intérieur du conteneur.
j'utilise ce workflow pour permettre à mon équipe de développement de compiler le code C / C++ pour la cible arm64, dont je maintiens la bsp (la my-docker-image
contient le cross-compilateur, sysroot, faire, 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 montré ci-dessus. addgroup/useradd
machines permet à l'utilisateur de propriété de tous les fichiers/répertoires créés par la construction.
bien que cela fonctionne pour nous. Il semble sorte de hacky. Je suis ouvert aux implémentations alternatives ...
Exécuter une commande en tant que www-data de l'utilisateur: docker exec -t --user www-data container bash -c "ls -la"