web-dev-qa-db-fra.com

Basculer les utilisateurs dans l'image Docker vers un utilisateur non root

J'essaie de passer d'utilisateur à utilisateur Tomcat7 afin de configurer les certificats SSH.

Quand je fais su Tomcat7, Rien ne se passe.

whoami reste encore root après avoir fait su Tomcat7

Faire un more /etc/passwd _, Le résultat suivant indique clairement qu’il existe un utilisateur Tomcat7:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
messagebus:x:101:104::/var/run/dbus:/bin/false
colord:x:102:105:colord colour management daemon,,,:/var/lib/colord:/bin/false
saned:x:103:106::/home/saned:/bin/false
Tomcat7:x:104:107::/usr/share/Tomcat7:/bin/false

Ce que j'essaie de contourner est cette erreur dans Hudson:

Command "git fetch -t git@________.co.za:_______/_____________.git +refs/heads/*:refs/remotes/Origin/*" returned status code 128: Host key verification failed.

Ceci est mon Dockerfile, il faut un fichier hudson war existant et une configuration tarée et construit une image, hudson fonctionne correctement, il ne peut tout simplement pas accéder à git car les certificats n'existent pas pour l'utilisateur Tomcat7.

FROM debian:wheezy

# install Java on image
RUN apt-get update
RUN apt-get install -y openjdk-7-jdk Tomcat7

# install hudson on image
RUN rm -rf /var/lib/Tomcat7/webapps/*
ADD ./ROOT.tar.gz /var/lib/Tomcat7/webapps/

# copy hudson config over to image
RUN mkdir /usr/share/Tomcat7/.hudson
ADD ./dothudson.tar.gz /usr/share/Tomcat7/
RUN chown -R Tomcat7:Tomcat7 /usr/share/Tomcat7/

# add ssh certificates
RUN mkdir /root/.ssh
ADD ssh.tar.gz /root/

# install some dependencies
RUN apt-get update
RUN apt-get install --y maven
RUN apt-get install --y git
RUN apt-get install --y Subversion

# background script
ADD run.sh /root/run.sh
RUN chmod +x /root/run.sh

# expose port 8080
EXPOSE 8080


CMD ["/root/run.sh"]

J'utilise la dernière version de Docker (version 1.0.0 de Docker, version 63fe64c/1.0.0). S'agit-il d'un bogue dans Docker ou manque-t-il quelque chose dans mon fichier Docker?

54

Vous ne devez pas utiliser su dans un fichier docker , toutefois, vous devez utiliser l'instruction USER dans le fichier docker.

À chaque étape de la compilation Dockerfile , un nouveau conteneur est créé afin que toute modification apportée à l'utilisateur ne soit pas conservée à l'étape de construction suivante.

Par exemple:

RUN whoami
RUN su test
RUN whoami

Cela ne dirait jamais que l'utilisateur serait test car un nouveau conteneur est créé le 2ième whoami. Le résultat serait root sur les deux (à moins bien sûr que vous utilisiez préalablement USER).

Si toutefois vous le faites:

RUN whoami
USER test
RUN whoami

Vous devriez voir root puis test.

Sinon, vous pouvez exécuter une commande en tant qu’utilisateur différent avec Sudo avec quelque chose comme:

Sudo -u test whoami

Mais il semble préférable d'utiliser l'instruction officielle prise en charge.

77
Marcus Hughes

En tant qu'approche différente de l'autre réponse, au lieu d'indiquer l'utilisateur lors de la création de l'image sur le fichier Dockerfile, vous pouvez le faire via une ligne de commande sur un conteneur particulier, commande par commande.

Avec docker exec, utilisation --user pour spécifier le compte d'utilisateur que le terminal interactif utilisera (le conteneur doit être en cours d'exécution et l'utilisateur doit exister dans le système conteneurisé):

docker exec -it --user [username] [container] bash

Voir https://docs.docker.com/engine/reference/commandline/exec/

20
That Brazilian Guy

Vous devriez aussi pouvoir faire:

apt install Sudo

Sudo -i -u Tomcat

Ensuite, vous devriez être l'utilisateur Tomcat. La distribution Linux que vous utilisez n'est pas claire, mais cela fonctionne avec Ubuntu 18.04 LTS, par exemple.

0
wordsforthewise