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