Normalement, les conteneurs Docker sont exécutés à l'aide de la racine utilisateur . Je voudrais 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 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 me connecte 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 Dockerfile en utilisant
RUN apt-get install sudo
Cela se traduit par impossible de localiser le package sudo
docker
sudo
linux-containers
drubb
la source
la source
Réponses:
Viens de le recevoir. Comme l'a souligné regan, j'ai dû 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é:
la source
adduser
commande crache l'aide à l'utilisation pouruseradd
/etc/sudoers.d/
et définir les autorisations440
sur ce fichier. Ensuite, l'utilisateur aurait un accès sudo sous CentOS, 6 et plus. 5 vous devrez ajouter la#includedir /etc/sudoers.d
directive/etc/sudoers
Lorsque ni sudo ni apt-get n'est disponible 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
la source
Les autres réponses n'ont pas fonctionné pour moi. J'ai continué à chercher et j'ai trouvé un article de blog qui couvrait comment une équipe exécutait non root à l'intérieur d'un conteneur Docker.
Voici la version TL; DR:
J'utilisais
FROM node:9.3
pour cela, mais je soupçonne que d'autres bases de conteneurs similaires fonctionneraient également.la source
ubuntu:bionic-20180724.1
. J'ai utilisé cette approche mais, après ce qui précède, elle ne me permet pas d'installer un autre package. Une ligne I annexé au - dessusDockerfile
afin d'installer un package avec:RUN apt-get install -y tree
. Cependant, cela m'a donné ce message d'erreur:Step xxxx/xxxx : RUN apt-get install -y tree ---> Running in j5e6gsvwfafa Reading package lists... E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied) E: Unable to lock directory /var/lib/apt/lists/
RUN sudo apt-get install -y tree
. Après avoir défini leUSER
sur autre chose queroot
, vous devrez utilisersudo
pour toutes les commandes qui nécessitent desroot
privilèges.sudo
c'était autorisé dans un Dockerfile.Pour toute personne qui a ce problème avec un conteneur déjà en cours d'exécution et qui ne veut pas nécessairement reconstruire, la commande suivante se connecte à un conteneur en cours d'exécution avec des privilèges root:
Vous pouvez également vous connecter en utilisant son ID, plutôt que son nom, en le trouvant avec:
Pour enregistrer vos modifications afin qu'elles soient toujours là au prochain lancement du conteneur (ou du cluster de composition de docker):
Pour démarrer un conteneur qui n'est pas en cours d'exécution et se connecter en tant que root:
Pour copier à partir d'un conteneur en cours d'exécution:
Pour exporter une copie de l'image:
Que vous pouvez restaurer dans une autre installation Docker en utilisant:
C'est beaucoup plus rapide mais prend plus de place pour ne pas compresser, en utilisant:
Et:
la source
si vous voulez vous connecter au conteneur et installer quelque chose en
utilisant apt-get en
premier comme réponse ci-dessus de notre frère "Tomáš Záluský"
puis essayez de
ça a fonctionné avec moi j'espère que c'est utile pour tous
la source
Si SUDO ou apt-get n'est pas accessible à l'intérieur du conteneur, vous pouvez utiliser l'option ci-dessous pour exécuter le conteneur.
" f83b5c5bf413" est mon ID de conteneur et voici un exemple de travail de mon terminal:
la source
Voici comment configurer un utilisateur non root avec l'image de base de
ubuntu:18.04
:Que se passe-t-il avec le code ci-dessus:
foo
sont créés.foo
est ajouté à la fois aufoo
et ausudo
groupe.uid
etgid
est défini sur la valeur de999
./home/foo
./bin/bash
.sed
commande effectue des mises à jour en ligne du/etc/sudoers
fichier pour autoriser les utilisateursfoo
et l'root
accès sans mot de passe ausudo
groupe.sed
commande désactive la#includedir
directive qui permettrait à tous les fichiers des sous-répertoires de remplacer ces mises à jour en ligne.la source
Si vous avez un conteneur en cours d'exécution en tant que root qui exécute un script (que vous ne pouvez pas modifier) qui a besoin d'accéder à la
sudo
commande, vous pouvez simplement créer un nouveausudo
script dans votre$PATH
qui appelle la commande passée.Par exemple, dans votre Dockerfile:
la source
-e
duecho
. Sinon, il sera présent dans le fichier lui-même, ce qui le rendra fonctionnel.sudo -E ls
. Il va essayer de s'exécuter-E ls
.Cela peut ne pas fonctionner pour toutes les images, mais certaines images contiennent déjà un utilisateur root, comme dans l'image jupyterhub / singleuser. Avec cette image, c'est tout simplement:
la source
Utilisez l'alias.
Simple mais efficace. N'oubliez pas de l'ajouter à ~ / .bash_aliases pour qu'il fonctionne après avoir ouvert un nouveau shell.
Étant donné que l'utilisateur est root par défaut dans Docker, «ignorer» la commande sudo est le moyen le plus simple.
la source
Contrairement à la réponse acceptée , j'utilise à la
usermod
place.Supposons que vous êtes déjà connecté en tant que root dans Docker et que "fruit" est le nouveau nom d'utilisateur non root que je veux ajouter, exécutez simplement ces commandes:
N'oubliez pas d'enregistrer l'image après la mise à jour. Utilisez
docker ps
pour obtenir <CONTAINER ID> et <IMAGE> dudocker commit -m "added sudo user" <CONTAINER ID> <IMAGE>
docker en cours d' exécution, puis exécutez pour enregistrer l'image du docker.Testez ensuite avec:
Ou testez par connexion directe (assurez-vous d'abord de sauvegarder l'image) en tant qu'utilisateur non root lors du lancement du docker:
Vous pouvez utiliser
sudo -k
pour réinitialiser l'horodatage de l'invite de mot de passe:la source