2015-08-14 8 views
7

ich mit Docker das docker-solr Bild verwenden, und ich brauche ein Verzeichnis darin zu montieren, die ich mit der -v Flagge erreichen.Docker können nicht in Verzeichnis schreiben montiert mit -v es sei denn, es 777 Berechtigungen

Das Problem besteht darin, dass der Container in das Verzeichnis geschrieben werden muss, in das ich ihn eingehängt habe, aber es scheint nicht die Berechtigungen dazu zu haben, es sei denn, ich mache chmod 777 für das gesamte Verzeichnis. Ich denke nicht, dass das Setzen der Erlaubnis, allen Benutzern das Lesen und Schreiben zu erlauben, die Lösung ist, sondern nur eine vorübergehende Lösung.

Kann mir jemand bei der Suche nach einer kanonischen Lösung helfen?

Bearbeiten: Ich habe Docker ohne sudo ausgeführt, weil ich mich selbst zur Docker-Gruppe hinzugefügt habe. Ich habe gerade festgestellt, dass das Problem gelöst ist, wenn ich Docker mit sudo ausführen, aber ich bin neugierig, ob es andere Lösungen gibt.

+5

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

Antwort

1

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.

Verwandte Themen