2016-03-23 2 views
0

Ich schreibe eine Dockerfile, wo der Benutzer root einen Benutzer namens blog erstellt, um die Website-Bereitstellung zu verwalten. Ich benutze den Docker Hub wordpress Container als Basis. Der Root-Benutzer erstellt Ordner unter /var/www/html und gibt dem blog Benutzer Berechtigungen zum Schreiben darunter.Wie kann man die Reihenfolge von RUN-Befehlen in einer Dockerdatei beeinflussen?

In den folgenden RUN-Befehlen nach USER blog bestätigen diese Befehle nicht den vorherigen Zustand, in dem blog Benutzer die Berechtigung zum Schreiben in /var/www/html erhalten hat. Dieser Benutzer muss ein Git Repo dort klonen, aber ich bekomme den Fehler fatal: could not create leading directories of '/var/www/html/wp-content/uploads': Permission denied aufgrund des neuen Benutzers nicht in der Lage, dort zu schreiben, trotz der Einstellung Berechtigungen für diesen Benutzer zuvor.

Hier sind die Befehle, die ich bin mit dem blog Benutzer erstellen, kopieren Sie Dateien auf ihr Home-Verzeichnis, und dann einen Repo mit diesem Benutzer klonen:

ENV WORDPRESS_DB_USER=wp_blog \ 
WORDPRESS_DB_NAME=wp_blog \ 
WORDPRESS_DIR=/var/www/html \ 
TERM=xterm 

# Setup the WordPress site user 
# Preliminary command 
RUN useradd --create-home --shell /bin/false --groups www-data blog  

COPY id_rsa* known_hosts /home/blog/.ssh/ 
## First set of commands 
RUN mkdir --parents "$WORDPRESS_DIR"/wp-content/uploads \ 
&& chown --recursive blog:blog "$WORDPRESS_DIR" \ 
&& chown --recursive blog:blog /home/blog 

USER blog 
## Second set of commands 
RUN chmod u=rw,g=,o= /home/blog/.ssh/id_rsa \ 
&& chmod u=rw,g=r,o=r /home/blog/.ssh/id_rsa.pub \ 
&& chmod u=rw,g=r,o=r /home/blog/.ssh/known_hosts \ 
&& eval $(ssh-agent -s) \ 
&& ssh-add \ 
&& export PATH=$PATH:/usr/sbin \ 

# Use the WordPress user to download the content repo and hooks 
# The following command results in a permissions error: 
&& git clone [email protected]:jb-merideoux/jbm-uploads.git "$WORDPRESS_DIR"/wp-content/uploads \ 
&& mkdir --parents /home/blog/git/wpgithooks \ 
&& cd /home/blog/git/wpgithooks \ 
&& git clone [email protected]:enderandpeter/wpgithooks.git /home/blog/git/wpgithooks \ 
&& git checkout --git-dir=/home/blog/git/wpgithooks/.git --track origin/wpaddons \ 
&& chmod u+x /home/blog/git/wpgithooks/*.sh \ 
&& echo Run the script at /home/blog/git/wpgithooks/setup.sh to get started 

Der blog Benutzer können Berechtigungen festlegen für das kopierte SSH-Schlüsselpaar, aber es kann nicht, wenn der chown --recursive blog:blog /home/blog Befehl nicht vorhanden ist. Ich würde denken, dass der vorherige chown --recursive blog:blog "$WORDPRESS_DIR" Befehl würde gleich auswirken, ob der blog Benutzer in /var/www/html in der gleichen Reihe von Befehlen schreiben kann, wo blog Berechtigungen für Dateien nach Hause kopiert von root nach dem root Benutzer sicher alles unter /home/blog war im Besitz von blog. Irgendwie sind die Berechtigungen für /home/blog in der zweiten Reihe von RUN-Befehlen wirksam, aber nicht die Berechtigungen für /var/www/html.

Bei näherer Betrachtung scheint es, dass die mkdir --parents "$WORDPRESS_DIR"/wp-content/uploads Anweisung nicht ausgeführt wird, entweder weil, wenn ich den git clone Befehl mit etwas voraus eine Datei wie touch "$WORDPRESS_DIR"/wp-content/uploads/afile zu erstellen, der Fehler ist touch: cannot touch '/var/www/html/wp-content/uploads/afile': No such file or directory.

Wenn ich versuche, afile in /var/www/html/ zu schaffen (was bereits vorhanden ist, weil es von der Basis Wordpress Container erstellt wurde), erhalte ich die Fehler touch: cannot touch '/var/www/html/afile': Permission denied, was darauf hinweist, dass der chown --recursive blog:blog "$WORDPRESS_DIR" Befehl wurde nicht anerkannt. Von den drei Befehlen in der ersten Gruppe von RUN-Anweisungen sieht es so aus, als ob die einzige Anweisung, die von der zweiten Gruppe von RUN-Anweisungen bestätigt wird, chown --recursive blog:blog /home/blog ist.

Wie kann ich diese Dockerfile schreiben, so dass alle Befehle in der ersten RUN-Anweisung zu dem Zeitpunkt ausgegeben wurden, zu dem der zweite Satz von RUN-Anweisungen vom neuen Benutzer ausgeführt wird?

+0

Siehe diesen Link. Es ist sehr wahrscheinlich kein Berechtigungsproblem, aber ein ssh-Schlüsselproblem http://www.docunext.com/blog/2011/02/fatal-could-not-create-leading-directories-of-permission-denied.html –

+0

Danke für den Hinweis! Ich werde es mir ansehen. Ich habe eine andere StackOverflow-Frage gefunden, die ich gerade nicht finde. Ich habe meine Frage mit einigen Beobachtungen bearbeitet, die mich davon überzeugen, dass nur einer der ersten Befehle ausgeführt wurde, als der zweite Befehlssatz ausgegeben wurde. –

Antwort

0

Wow, das war intensiv. Die zweite Reihe von Befehlen greift nie auf, was vorher gemacht wurde. Ich habe Beispiele gesehen, in denen nachfolgende RUN-Befehle die Dinge kennen, die in vorherigen passiert sind, so dass ich immer noch nicht genau weiß, wie das bestimmt ist.

Die Lösung, die ich fand, war su im ersten Satz von Befehlen zu verwenden, direkt nach Verzeichnisse root erstellt und legt Berechtigungen:

RUN mkdir --parents "$WORDPRESS_DIR"/wp-content/uploads \ 
    && chown --recursive blog:blog "$WORDPRESS_DIR" \ 
    && chown --recursive blog:blog /home/blog \ 
    && su - blog -s /bin/bash -c '\ 
     chmod u=rwx,g=,o= /home/blog/.ssh \ 
     && chmod u=rw,g=,o= /home/blog/.ssh/id_rsa \ 
... 
    && git clone [email protected]:jb-merideoux/jbm-uploads.git '"$WORDPRESS_DIR"'/wp-content/uploads \ 
... 
    && echo '"$WORDPRES_DIR"' setup complete.' 

Wie Sie sehen können, dass einige verrückt zitiert, aber zum Glück können Sie Formatiere die Befehle genau so, als ob sie direkt an die Dockerdatei übergeben würden. Ich habe USER blog ganz am Ende verwendet, um Dinge zu tun, die nicht von den früheren Sachen abhängig waren, aber ich denke, manchmal mit Docker müssen Sie eine ganze Reihe von Befehlen zusammenstellen, aber ich kann wahrscheinlich alles in ein separates Skript bringen ...

Verwandte Themen