web-dev-qa-db-fra.com

Se connecter au conteneur Docker en tant qu'utilisateur autre que root

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? 

30
Andy59469

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 

  1. commencez par cet utilisateur run --user <user> ou mentionnez-le dans votre Dockerfile en utilisant USER
  2. changer l'utilisateur en utilisant `su 
33
Larry Cai

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

22
Jason

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é.

5
kliew

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.

1
typelogic

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"

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 ...

1
rmccabe3701

Exécutez la commande en tant qu'utilisateur www-data: docker exec -t --user www-data container bash -c "ls -la"

0
Vasili Pascal