So beheben Sie Dateiberechtigungen für wp-content mit dem offiziellen WordPress-Image für docker-compose
Lesezeit: 6 Minuten
Danny_DD
Problem
Ich richte eine lokale WordPress-Umgebung mit Docker-Compose und dem offiziellen WordPress-Image aus dem Docker-Repository ein.
Ich bin auf Windows.
Das Problem ist, dass ich einige Probleme mit den Voraussetzungen für den wp-Inhalt habe und ich keine Dateien von meinem WordPress-Admin-Panel hochladen kann.
Was ich schon gemacht habe
Ich habe dann die Dateiberechtigungen im Container überprüft, und dies war die Ausgabe:
Wie Sie sehen können, ist der Besitzer meiner wp-content ist root Anstatt von www-data.
Die unmittelbare Lösung besteht darin, die Bash des Containers zu öffnen und zu geben chown -R www-data:www-data /var/www/html/wp-content/
Das funktioniert natürlich, aber ich möchte diesen Vorgang nicht jedes Mal durchführen, wenn ich ein neues WordPress-Projekt starte. Um dies zu erreichen, habe ich eine erstellt Dockerfile so was:
FROM wordpress:5.1.1
# install dos2unix (fix problem between CRLF and LF)
RUN apt-get update
RUN apt-get install -y dos2unix
# increase upload limit
RUN touch /usr/local/etc/php/conf.d/uploads.ini \
&& echo "upload_max_filesize = 10M;" >> /usr/local/etc/php/conf.d/uploads.ini
# fix permissions issues
COPY entrypoint.sh /
RUN dos2unix /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
Aber dann wurde mir klar, dass ich das außer Kraft setzte ENTRYPOINT des ursprünglichen WordPress-Images, und der Container wurde immer mit beendet code 0.
Dann habe ich es mit probiert CMD Anstatt von ENTRYPOINTund ich habe meine geändert Dockerfile so was:
Aber ich erhalte immer die Fehlermeldung, dass die Datei oder der Ordner nicht existiert.
Ich habe versucht zu verwenden CMD auch so: CMD ["chown", "-R", "www-data:www-data", "/var/www/html/wp-content/"]
aber ohne Erfolg.
Frage
Es gibt eine Möglichkeit, einen Befehl auszuführen nach das Original ENTRYPOINT?
Kennen Sie sonst einen besseren Weg, um dieses Problem zu lösen?
Wie erstellt man den Container?
– benaich
25. August 2019 um 8:45 Uhr
Sie können Ihre ändern ./entrypoint.sh Skript, um das Standard-Einstiegspunkt-Skript des Originalbilds auszuführen, nachdem es Ihren chown-Befehl ausgeführt hat:
Ist das aber Best Practice? Was ist, wenn sich das standardmäßige Einstiegspunktskript irgendwann in der Zukunft ändert? Da ich jetzt auf dieses Problem stoße, bin ich mir nicht sicher, ob ich das WordPress-Image mit einer Docker-Datei “erweitern” oder das tun soll, was Ihre Antwort vorschlägt.
– Mathee
8. August 2020 um 14:41 Uhr
@Patrick Steadman ist es nicht technisch gesehen der gesamte Ordner, der root gehören muss?
– FooBar
8. November 2020 um 16:31 Uhr
@FooBar Ich denke, das hängt vom Anwendungsfall und der Einstellung des Einzelnen ab wp-content im Besitz von www-data sollte ausreichen, um das Hochladen von Medien-/Plug-in-/Theme-Dateien über wp-admin zu ermöglichen, aber es schafft ein neues Problem für Berechtigungsprobleme beim Bearbeiten von Dateien in Bind-Mounts vom Docker-Host, das durch Hinzufügen gelöst werden kann Ihr aktueller Benutzer im Host der www-data-Gruppe (oder welche Gruppe auch immer gid 33 auf Ihrem System hat). All dies fühlt sich sehr hacky an, ich würde eine bessere Lösung lieben … Ich habe versucht, die Benutzer-ID zu ändern, die WordPress im Container ohne Erfolg ausführt.
– Patrick Steadmann
8. November 2020 um 20:06 Uhr
Aus der Docker-Dokumentation ist der Befehl, den Sie verwenden sollten RUN.
Verwechseln Sie RUN nicht mit CMD. RUN führt tatsächlich einen Befehl aus und schreibt das Ergebnis fest; CMD führt zur Build-Zeit nichts aus, sondern gibt den beabsichtigten Befehl für das Image an.
Die Zeile in Ihrem Dockerfile sollte also lauten: RUN chown -R www-data:www-data /var/www/html/wp-content
Um die Anzahl der erstellten Ebenen und die Größe Ihres Bildes zu verringern, würde ich so viele der Ebenen verketten RUN Befehle wie möglich. Zum Beispiel (nicht getestet):
FROM wordpress:5.1.1
# install dos2unix (fix problem between CRLF and LF) and increase upload limit
RUN apt-get update -y && \
apt-get install -y dos2unix && \
touch /usr/local/etc/php/conf.d/uploads.ini \
&& echo "upload_max_filesize = 10M;" >> /usr/local/etc/php/conf.d/uploads.ini && \
chown -R www-data:www-data /var/www/html/wp-content
# fix permissions issues
COPY entrypoint.sh /
RUN dos2unix /entrypoint.sh && \
chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
Ich bin ein wenig verwirrt: Dein run-Befehl ändert bereits den Besitzer von wp-content. Benötige ich alles, was mit entrypoint.sh zu tun hat?
Dies liegt an der Art und Weise, wie das WordPress-Docker-Image erstellt wird.
Ich habe eine erstellt Pull-Anfrage zu machen wp-content Ordner gehören www-data wenn es (oder einige seiner Unterordner) mit einem Volume geteilt wird.
Bevor es zusammengeführt wird (es sei denn, es ist), können Sie Ihr eigenes WordPress-Docker-Image erstellen, um meine Änderung zu integrieren. Nehmen Sie einen der Ordner auf https://github.com/docker-library/wordpress (Wählen Sie die PHP-Version und dann die Webserver-Parameter).
Ein … kreieren docker/wordpress Ordner in Ihrem Projekt.
Kopieren Sie die beiden Rohdateien (Dockerfile und docker-entrypoint.sh) von GitHub in diesen Ordner.
Ersetzen Sie diese Zeilen in docker-entrypoint.sh:
if [ "$(id -u)" = '0' ] && [ "$(stat -c '%u:%g' .)" = '0:0' ]; then
chown "$user:$group" .
fi
durch:
if [ "$(id -u)" = '0' ]; then
chown -R "$user:$group" .
fi
Ich habe es mit diesem Git versucht, aber die laufende Shell-Datei hat einen Fehler bekommen: stackoverflow.com/questions/62752579/…
– Swe Zin Phyoe
6. Juli 2020 um 10:04 Uhr
Problem
Das Elternteil docker-entrypoint.sh ist hinterher gelaufen Dockerfile und entrypoint.shwodurch die von Ihnen festgelegten Berechtigungen überschrieben werden.
Lösung
Benutzerdefinierter Einstiegspunkt, der einen verzögerten Befehl ausführt, der den Besitz danach festlegt docker-entrypoint.sh gelaufen ist.
Dein Dockerfile
FROM wordpress:php7.4-apache
[...]
ENTRYPOINT ["/entrypoint.sh"]
Dein entrypoint.sh
# In 10 seconds set the ownership
$(sleep 10 && chown -R www-data:www-data /var/www/html/) &
# Run the parent's ENTRYPOINT and CMD as defined in its Dockerfile
# (https://github.com/gsusI/wordpress/blob/master/php7.4/apache/Dockerfile)
docker-entrypoint.sh apache2-foreground # run parent entrypoint.
Notiz: Das manuelle Aufrufen von ENTRYPOINT und CMD des übergeordneten Elements bedeutet, dass diese Lösung möglicherweise nicht ordnungsgemäß funktioniert, wenn das übergeordnete Dockerfile seine letzten beiden Zeilen ändert.
Daher ist es empfehlenswert, dass Sie bei jeder Aktualisierung Ihrer FROMüberprüfen Sie die Docker-Datei des übergeordneten Elements, um sicherzustellen, dass die letzten beiden Zeilen noch vorhanden sind:
Wie erstellt man den Container?
– benaich
25. August 2019 um 8:45 Uhr