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?
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 –
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. –