web-dev-qa-db-fra.com

Comment utiliser Sudo dans un conteneur de docker?

Normalement, les conteneurs Docker sont exécutés à l'aide de l'utilisateur root. J'aimerais utiliser un autre utilisateur, ce qui ne pose aucun problème en utilisant la directive USER de docker. Mais cet utilisateur devrait pouvoir utiliser Sudo à l'intérieur du conteneur. Cette commande est manquante.

Voici un fichier Dockerfile simple à cet effet:

FROM ubuntu:12.04

RUN useradd docker && echo "docker:docker" | chpasswd
RUN mkdir -p /home/docker && chown -R docker:docker /home/docker

USER docker
CMD /bin/bash

En exécutant ce conteneur, je suis connecté avec l'utilisateur 'docker'. Lorsque j'essaie d'utiliser Sudo, la commande est introuvable. J'ai donc essayé d'installer le paquet Sudo dans mon fichier Dockerfile à l'aide de

RUN apt-get install Sudo

Cela se traduit par Impossible de localiser le package Sudo

201
drubb

Viens de le recevoir. Comme Regan l'a souligné, je devais ajouter l'utilisateur au groupe sudoers. Mais la raison principale était que j'avais oublié de mettre à jour le cache des référentiels, donc apt-get n'a pas pu trouver le paquet Sudo. Ça marche maintenant. Voici le code complété:

FROM ubuntu:12.04

RUN apt-get update && \
      apt-get -y install Sudo

RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker Sudo

USER docker
CMD /bin/bash
208
drubb

Lorsque ni Sudo ni apt-get ne sont disponibles dans le conteneur, vous pouvez également accéder au conteneur en cours d'exécution en tant qu'utilisateur root à l'aide de la commande

docker exec -u root -t -i container_id /bin/bash
48
Tomáš Záluský

Les autres réponses n'ont pas fonctionné pour moi. J'ai continué à chercher et j'ai trouvé un article de blog qui expliquait comment une équipe exécutait une application non root à l'intérieur d'un conteneur de menu fixe.

Voici la version TL; DR:

RUN apt-get update
RUN apt-get install Sudo

RUN adduser --disabled-password --gecos '' docker
RUN adduser docker Sudo
RUN echo '%Sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

USER docker

# this is where I was running into problems with the other approaches
RUN Sudo apt-get update 

J'utilisais FROM node:9.3 pour cela, mais je soupçonne que d'autres bases de conteneurs similaires fonctionneraient également.

48
M. Scott Ford

si vous voulez vous connecter au conteneur et installer quelque chose
en utilisant apt-get
première comme ci-dessus réponse de notre frère "Tomáš Záluský"

docker exec -u root -t -i container_id /bin/bash

alors essayez de

Lancez apt-get update ou apt-get 'tout ce que vous voulez'

cela a fonctionné avec moi j'espère que c'est utile pour tous

14
Ismail

Pour tous ceux qui ont ce problème avec un conteneur déjà en cours d'exécution et qui ne veulent pas nécessairement reconstruire, la commande suivante se connecte à un conteneur en cours d'exécution avec des privilèges root:

docker exec -ti -u root container_name bash

Vous pouvez également vous connecter en utilisant son identifiant, plutôt que son nom, en le recherchant avec:

docker ps -l

Pour enregistrer vos modifications afin qu'elles soient toujours présentes lors du prochain lancement du conteneur (ou du cluster docker-compose):

docker commit container_id image_name

Pour démarrer un conteneur qui ne fonctionne pas et vous connecter en tant que root:

docker run -ti -u root --entrypoint=/bin/bash container_name -s

Pour copier à partir d'un conteneur en cours d'exécution:

docker cp <containerId>:/file/path/within/container /Host/path/target

Pour exporter une copie de l'image:

docker save container | gzip > /dir/file.tar.gz

Que vous pouvez restaurer sur une autre installation de Docker en utilisant:

gzcat /dir/file.tar.gz | docker load

C'est beaucoup plus rapide mais prend plus d'espace pour ne pas compresser, en utilisant:

docker save container | dir/file.tar

Et:

cat dir/file.tar | docker load
8
Chris

Si un conteneur fonctionnant en tant que root exécute un script (que vous ne pouvez pas modifier) ​​et qui nécessite un accès à la commande Sudo, vous pouvez simplement créer un nouveau script Sudo dans votre $PATH qui appelle le passé la commande.

par exemple. Dans votre fichier Docker:

RUN if type Sudo 2>/dev/null; then \ 
     echo "The Sudo command already exists... Skipping."; \
    else \
     echo -e "#!/bin/sh\n\${@}" > /usr/sbin/Sudo; \
     chmod +x /usr/sbin/Sudo; \
    fi
2
XtraSimplicity