So beheben Sie Dateiberechtigungen für wp-content mit dem offiziellen WordPress-Image für docker-compose

Lesezeit: 6 Minuten

Benutzeravatar von Danny_DD
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.
WordPress-Fehler Verzeichnis kann nicht erstellt werden

Was ich schon gemacht habe


Ich habe dann die Dateiberechtigungen im Container überprüft, und dies war die Ausgabe:

Dateiberechtigungen im WordPress-Container

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"]

Und meine entrypoint.sh sieht aus wie das:

#!/bin/bash
echo Fixing permissions...
chown -R www-data:www-data /var/www/html/wp-content/

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:

FROM wordpress:5.1.1

# 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

CMD chown -R www-data:www-data /var/www/html/wpcontent/

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:

#!/bin/bash
echo Fixing permissions...
chown -R www-data:www-data /var/www/html/wp-content/
docker-entrypoint.sh apache2-foreground

  • 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?

    – Westen

    13. Januar 2020 um 14:15 Uhr

  • Leider wird dies nicht funktionieren. Alle Änderungen werden nach Abschluss des Builds überschrieben. Quelle: docs.docker.com/engine/reference/builder/…

    – Ángel Jiménez

    12. Juni 2020 um 15:12 Uhr

Benutzeravatar von Michaël Perrin
Michael Perrin

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).

  1. Ein … kreieren docker/wordpress Ordner in Ihrem Projekt.
  2. Kopieren Sie die beiden Rohdateien (Dockerfile und docker-entrypoint.sh) von GitHub in diesen Ordner.
  3. 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:

ENTRYPOINT ["docker-entrypoint.sh"]

CMD ["apache2-foreground"]
1406380cookie-checkSo beheben Sie Dateiberechtigungen für wp-content mit dem offiziellen WordPress-Image für docker-compose

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy