Benutzer innerhalb des Docker-Images zu einem Nicht-Root-Benutzer wechseln

79

Ich versuche, den Benutzer zum Benutzer tomcat7 zu wechseln, um SSH-Zertifikate einzurichten.

Wenn ich das tue su tomcat7, passiert nichts.

whoami rinnt immer noch Wurzel nach dem Tun su tomcat7

Doing a more /etc/passwd, ich folgendes Ergebnis erhalten , die deutlich zeigt , dass ein tomcat7 Benutzer vorhanden ist :

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

Ich versuche, diesen Fehler in Hudson zu umgehen:

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

Dies ist meine Docker-Datei. Sie benötigt eine vorhandene Hudson War-Datei und -Konfiguration, die geteert ist und ein Image erstellt. Hudson läuft einwandfrei. Aufgrund von Zertifikaten, die für den Benutzer tomcat7 nicht vorhanden sind, kann einfach nicht auf Git zugegriffen werden.

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"]

Ich verwende die neueste Version von Docker (Docker Version 1.0.0, Build 63fe64c / 1.0.0). Ist dies ein Fehler in Docker oder fehlt mir etwas in meiner Docker-Datei?

Jan Vladimir Mostert
quelle
4
USERKennen Sie die Dockerfile-Anweisung?
Eiskriminalität
1
Nein, wofür schlägst du vor, dass ich es benutze?
Jan Vladimir Mostert
Wäre es möglich, mithilfe der USER-Anweisung Zertifikate über die Docker-Datei zu generieren?
Jan Vladimir Mostert
3
Alles, was Sie RUNnach einer USERAnweisung tun, wird unter der entsprechenden UID ausgeführt. Obwohl ich nicht sicher bin, ob ich Ihr Problem perfekt verstehe, sieht es so aus, als ob es das ist, wonach Sie suchen.
Eiskriminalität
@icecrime leider nicht alles. COPYErstellt Dateien als UID 0, was bedeutet, dass sie vom Nicht-Root-Benutzer nicht beschreibbar sind. Die Ausführung RUN chown ...dieser Dateien funktioniert nur, wenn der aktuelle Benutzer auch Root ist. So wechselt man im gesamten Dockerfile zwischen root und dem anderen Benutzer hin und her.
DavidA

Antworten:

116

Sie sollten nicht suin einer Docker-Datei verwenden , Sie sollten jedoch die USERAnweisung in der Docker-Datei verwenden.

In jeder Phase des Dockerfile-Builds wird ein neuer Container erstellt, sodass Änderungen, die Sie am Benutzer vornehmen, in der nächsten Build-Phase nicht beibehalten werden .

Zum Beispiel:

RUN whoami
RUN su test
RUN whoami

Dies würde niemals bedeuten, dass der Benutzer sein würde, testda ein neuer Container auf dem 2. Whoami erzeugt wird. Die Ausgabe wäre root auf beiden (es sei denn, Sie führen USER vorher aus).

Wenn Sie jedoch:

RUN whoami
USER test
RUN whoami

Sie sollten rootdann sehen test.

Alternativ können Sie einen Befehl als anderer Benutzer mit sudo mit so etwas wie ausführen

sudo -u test whoami

Es scheint jedoch besser, die offiziell unterstützte Anweisung zu verwenden.

Marcus Hughes
quelle
Ich bin gespannt, wie ich sicherstellen kann, dass zuvor ausgeführte Befehle für den in der Docker-Datei festgelegten Benutzer verfügbar sind. Ich habe eine Frage, bei der Ordner und Berechtigungen, die zuvor von root festgelegt wurden, nicht verfügbar sind, nachdem mit der USERAnweisung zu einem anderen Benutzer gewechselt wurde.
Spencer Williams
3
Möglicherweise müssen COPY --chown=myuser ...Sie die Straße hinunter.
X-Yuri
36

Als eine andere Herangehensweise an die andere Antwort können Sie den Benutzer bei der Image-Erstellung in der Docker-Datei nicht über die Befehlszeile eines bestimmten Containers pro Befehl angeben.

Mit docker exec, Verwendung --userfestlegen , welches Benutzerkonto der interaktive Terminal Verwendung (der Behälter soll ausgeführt werden , und der Benutzer hat in dem Behältersystem existieren):

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

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

Dieser Brasilianer
quelle
6

Fügen Sie diese Zeile zur Docker-Datei hinzu

USER <your_user_name>

Verwenden Sie die Docker-Anweisung USER

vinay mavi
quelle
3

Sie sollten auch in der Lage sein:

apt install sudo

sudo -i -u tomcat

Dann sollten Sie der Tomcat-Benutzer sein. Es ist nicht klar, welche Linux-Distribution Sie verwenden, aber dies funktioniert beispielsweise mit Ubuntu 18.04 LTS.

Worte dafür
quelle
0

Wenn Sie privilegierte Aufgaben wie das Ändern der Berechtigungen von Ordnern ausführen müssen, können Sie diese Aufgaben als Root-Benutzer ausführen und dann einen nicht privilegierten Benutzer erstellen und zu diesem wechseln:

From <some-base-image:tag>

# Switch to root user
USER root # <--- Usually you won't be needed it - Depends on base image

# Run privileged command
RUN apt install <packages>
RUN apt <privileged command>

# Set user and group
ARG user=appuser
ARG group=appuser
ARG uid=1000
ARG gid=1000
RUN groupadd -g ${gid} ${group}
RUN useradd -u ${uid} -g ${group} -s /bin/sh -m ${user} <--- the '-m' create a user home directory

# Switch to user
USER ${uid}:${gid}

# Run non-privileged command
RUN apt <non-privileged command>
RtmY
quelle
-8

Es gibt keinen wirklichen Weg, dies zu tun. Infolgedessen schlagen Dinge wie mysqld_safe fehl, und Sie können mysql-server nicht in einem Debian-Docker-Container installieren, ohne durch 40 Rahmen zu springen, weil ... nun ... es abbricht, wenn es nicht root ist.

Sie können USER verwenden, aber Sie können apt-get install nicht installieren, wenn Sie nicht root sind.

John Moser
quelle