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?
USER
Kennen Sie die Dockerfile-Anweisung?RUN
nach einerUSER
Anweisung 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.COPY
Erstellt Dateien als UID 0, was bedeutet, dass sie vom Nicht-Root-Benutzer nicht beschreibbar sind. Die AusführungRUN 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.Antworten:
Sie sollten nicht
su
in einer Docker-Datei verwenden , Sie sollten jedoch dieUSER
Anweisung 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:
Dies würde niemals bedeuten, dass der Benutzer sein würde,
test
da 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:
Sie sollten
root
dann sehentest
.Alternativ können Sie einen Befehl als anderer Benutzer mit sudo mit so etwas wie ausführen
Es scheint jedoch besser, die offiziell unterstützte Anweisung zu verwenden.
quelle
USER
Anweisung zu einem anderen Benutzer gewechselt wurde.COPY --chown=myuser ...
Sie die Straße hinunter.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--user
festlegen , welches Benutzerkonto der interaktive Terminal Verwendung (der Behälter soll ausgeführt werden , und der Benutzer hat in dem Behältersystem existieren):Siehe https://docs.docker.com/engine/reference/commandline/exec/
quelle
Fügen Sie diese Zeile zur Docker-Datei hinzu
Verwenden Sie die Docker-Anweisung USER
quelle
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.
quelle
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:
quelle
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.
quelle