In jüngerer Zeit, nachdem ich durch einige offizielle Docker-Repositories geschaut habe, habe ich festgestellt, dass die idiomatische Methode, diese Berechtigungsprobleme zu lösen, etwas mit gosu zusammen mit einem Einstiegspunktskript ist. Zum Beispiel, wenn wir ein existierendes Dockerprojekt nehmen, zum Beispiel solr, das gleiche, mit dem ich früher Probleme hatte.
Die dockerfile10 auf Github baut sehr effektiv das gesamte Projekt, aber tut nichts, um die Berechtigungsprobleme zu berücksichtigen.
So, dies zu überwinden, zuerst habe ich die gosu Aufbau zum dockerfile (wenn Sie diese Mitteilung implementieren die Version 1.4
fest einprogrammiert ist. Sie suchten nach den neuesten Versionen überprüfen here).
# grab gosu for easy step-down from root
RUN mkdir -p /home/solr \
&& gpg --keyserver pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
&& curl -o /usr/local/bin/gosu -SL "https://github.com/tianon/gosu/releases/download/1.4/gosu-$(dpkg --print-architecture)" \
&& curl -o /usr/local/bin/gosu.asc -SL "https://github.com/tianon/gosu/releases/download/1.4/gosu-$(dpkg --print-architecture).asc" \
&& gpg --verify /usr/local/bin/gosu.asc \
&& rm /usr/local/bin/gosu.asc \
&& chmod +x /usr/local/bin/gosu
Jetzt können wir gosu verwenden, die im Grunde ist genau die gleiche wie su
oder sudo
, funktioniert aber viel schöner mit Docker. Aus der Beschreibung für gosu:
Dies ist ein einfaches Tool aus der einfachen Tatsache, dass su und sudo sehr seltsam und oft nervig TTY und Signalweiterleitung Verhalten haben.
Nun werden die anderen Änderungen, die ich an die dockerfile gemacht waren diese Addiert man diese Zeilen:
COPY solr_entrypoint.sh /sbin/entrypoint.sh
RUN chmod 755 /sbin/entrypoint.sh
ENTRYPOINT ["/sbin/entrypoint.sh"]
nur meine Einstiegspunkt Datei in den Docker Container hinzuzufügen.
und Entfernen der Leitung:
USER $SOLR_USER
Damit Sie standardmäßig der Benutzer root sind. (Deshalb müssen wir Gosu von der Wurzel heruntertreten).
Nun zu meiner eigenen Einstiegspunkt-Datei, ich glaube nicht, dass es perfekt geschrieben ist, aber es hat seinen Zweck erfüllt.
#!/bin/bash
set -e
export PS1="\w:\u docker-solr-> "
# step down from root when just running the default start command
case "$1" in
start)
chown -R solr /opt/solr/server/solr
exec gosu solr /opt/solr/bin/solr -f
;;
*)
exec [email protected]
;;
esac
Ein Docker Startbefehl nimmt die Form:
docker run <flags> <image-name> <passed in arguments>
Grundsätzlich ist der Einstiegspunkt sagt, wenn ich solr ausgeführt werden soll wie üblich wir das Argument start
bis zum Ende des Befehls wie folgt passieren:
docker run <flags> <image-name> start
und ansonsten die Befehle ausführen, die Sie als root übergeben.
Die start
Option erste gibt dem solr-Benutzer die Eigentümerschaft der Verzeichnisse und führt dann den Standardbefehl aus. Dies löst das Besitzproblem, da der Einstiegspunkt im Gegensatz zum Dockerfile-Setup, das einmalig ist, jedes Mal ausgeführt wird.
So, jetzt, wenn ich Verzeichnisse mit dem Flag -d montieren, bevor der Einstiegspunkt tatsächlich solr läuft, wird es die Dateien innerhalb des Docker Behälter für Sie chown.
Was das mit Ihren Dateien außerhalb des Containers angeht, hatte ich gemischte Ergebnisse, da Docker auf OSX etwas seltsam wirkt. Für mich änderte es nicht die Dateien außerhalb des Containers, aber auf einem anderen Betriebssystem, wo Docker besser mit dem Dateisystem spielt, könnte es Ihre Dateien außerhalb ändern, aber ich denke, dass Sie damit umgehen müssen, wenn Sie wollen um Dateien innerhalb des Containers zu mounten, anstatt sie einfach hinein zu kopieren.
Welcher Benutzer ist die Anwendung in dem Bild, das als läuft? Wenn es als 'solr'-Benutzer ausgeführt wird, kann es wahrscheinlich nicht in das Host-Verzeichnis geschrieben werden, es sei denn, Berechtigungen sind so eingerichtet, dass 'solr' Benutzer (mit uid im Container) in das Verzeichnis schreiben können. Diese erstaunliche [Antwort] (http://stackoverflow.com/questions/31955361/what-permissions-doe-i-need-to-enable-for-docker-volumes-to-work/31955607#31955607) von @larsks könnte helfen Ihnen bei der Einstellung der entsprechenden Berechtigungen. – Dharmit