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

PAR défaut lorsque vous exécutez

docker run -it [myimage]

OU

docker attach [mycontainer]

vous vous connectez au terminal en tant qu'utilisateur root, mais je voudrais me connecter en tant qu'utilisateur différent. Est-ce possible?

19
demandé sur Andy59469 2016-03-02 01:02:27

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

  1. démarrer avec cet utilisateur run --user <user> ou le mentionner dans votre Dockerfile en utilisant USER
  2. changer l'utilisateur en utilisant ' su
26
répondu Larry Cai 2016-03-02 07:26:58

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

19
répondu Jason 2016-11-20 03:47:42

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

5
répondu kliew 2016-03-02 00:39:29

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.

1
répondu ifelsemonkey 2017-12-19 20:16:10

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"

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

1
répondu rmccabe3701 2018-06-10 17:42:19

Exécuter une commande en tant que www-data de l'utilisateur: docker exec -t --user www-data container bash -c "ls -la"

0
répondu Vasili Pascal 2018-09-28 15:31:44