Ich habe ein containerisiertes WordPress-Projekt als Azure App Service basierend auf dem eingerichtet offizielles WordPress-Docker-Image wobei ich keine Änderungen am Image selbst vorgenommen habe, außer einen SSH-Server basierend auf den Anweisungen von hinzuzufügen Azurblau. So sieht das Dockerfile aus:
FROM wordpress:6.0.3-php7.4
########################################## Add SSH support for Azure ##########################################
# Install OpenSSH and set the password for root to "Docker!".
RUN apt update \
&& apt install -y openssh-server \
&& rm -rf /var/lib/apt/lists/*
RUN echo "root:Docker!" | chpasswd
# Copy the sshd_config file to the /etc/ssh/ directory
COPY docker/ssh/sshd_config /etc/ssh/
# Copy and configure the ssh_setup file
RUN mkdir -p /tmp
COPY docker/ssh/ssh_setup.sh /tmp
RUN chmod +x /tmp/ssh_setup.sh \
&& (sleep 1;/tmp/ssh_setup.sh 2>&1 > /dev/null)
# Open port 2222 for SSH access
EXPOSE 80 2222
###############################################################################################################
COPY docker/script.sh script.sh
RUN chmod +x script.sh
CMD []
ENTRYPOINT ["./script.sh"]
Und docker/script.sh
#!/bin/bash
exec service ssh start &
exec /usr/local/bin/docker-entrypoint.sh apache2-foreground
Auf dem App Service habe ich die hinzugefügt WEBSITES_ENABLE_APP_SERVICE_STORAGE=true
Anwendungseinstellung zu aktivieren Dauerspeicher sowie die einstellen WORDPRESS_DB_HOST
, WORDPRESS_DB_NAME
, WORDPRESS_DB_PASSWORD
und WORDPRESS_DB_USER
Einstellungen, um eine Verbindung zu meiner Datenbank herzustellen, die auf einem anderen Host ausgeführt wird.
Wenn ich im Browser auf die App-Service-Seite zugreife und das WordPress-Setup durchlaufe, kann ich problemlos neue Dateien hochladen, die im Dateisystem unter abgelegt werden /var/www/html/wp-content/uploads/<year>/<month>/<filename>
auf die ich dann in meinem Browser zugreifen kann https://my-app-service.azurewebsites.net/wp-content/uploads/<year>/<month>/<filename>
.
Mit Azure werden nur Daten gespeichert, die hineingeschrieben werden /home
Ich habe stattdessen versucht, die zu verschieben /var/www/html/wp-content/uploads
Verzeichnis zu /home/uploads
und erstellen Sie dann einen symbolischen Link zu diesem aus dem erwarteten Pfad wie folgt (die symbolische Linkerstellung könnte dann auch zur Dockerfile hinzugefügt werden, um dies während der Bereitstellung zu automatisieren):
$ cd /var/www/html/wp-content
$ mv uploads /home/uploads
$ ln -s /home/uploads uploads
Jetzt aber, wenn ich zugreife https://my-app-service.azurewebsites.net/wp-content/uploads/<year>/<month>/<filename>
Ich bekomme nur eine leere 400-Antwort.
Um zu sehen, ob dies eine Art Einschränkung von Azure war, entschied ich mich, stattdessen etwas Ähnliches mit der einfachsten Python-Seite zu versuchen. Dockerdatei:
FROM python:3.10.0
RUN mkdir -p /var/www/html
WORKDIR /var/www/html
########################################## Add SSH support for Azure ##########################################
# Install OpenSSH and set the password for root to "Docker!".
RUN apt update \
&& apt install -y openssh-server \
&& rm -rf /var/lib/apt/lists/*
RUN echo "root:Docker!" | chpasswd
# Copy the sshd_config file to the /etc/ssh/ directory
COPY docker/ssh/sshd_config /etc/ssh/
# Copy and configure the ssh_setup file
RUN mkdir -p /tmp
COPY docker/ssh/ssh_setup.sh /tmp
RUN chmod +x /tmp/ssh_setup.sh \
&& (sleep 1;/tmp/ssh_setup.sh 2>&1 > /dev/null)
# Open port 2222 for SSH access
EXPOSE 80 2222
###############################################################################################################
COPY docker/script.sh script.sh
RUN chmod +x script.sh
CMD []
ENTRYPOINT ["./script.sh"]
Und docker/script.sh
#!/bin/bash
exec service ssh start &
exec python -m http.server 80
Das Gleiche funktioniert hier, daher scheint es bei Azure keine Einschränkung zu geben. Was ich jedoch nicht verstehe, ist, dass das WordPress-Docker-Image mit dem symbolischen Link wie erwartet auf meinem lokalen Computer ausgeführt wird.
Was mache ich falsch? Warum funktioniert das Python-Projekt, aber nicht das WordPress-Projekt?
Bitte, meldet die Anwendung oder der App Service irgendwelche Fehler? Wahrscheinlich könnte der Fehler mit einer Art Berechtigungsproblem zusammenhängen, sogar mit einer schlechten Funktion des Symlinks (ehrlich gesagt kann ich Ihnen nicht sagen, ob es in diesem Anwendungsfall tatsächlich unterstützt wird oder nicht). Mein bester Rat ist die Verwendung Azure-Speicher basiert stattdessen auf Azure Files, um Ihre Upload-Informationen zu speichern oder Ihre gesamten Daten zu speichern
/var/www/html
Inhalt.– jccampanero
25. Oktober um 21:30 Uhr
Ich konnte keine Protokolle mit Fehlern oder Warnungen finden. Hast du eine Idee, wo ich das finden könnte? Ich habe überlegt, Azure Storage zu verwenden, würde es aber vorziehen, da dies weitere Kosten sind und ich mit meinem App Servive-Plan bereits 250 GB Speicherplatz erhalte, den ich dafür verwenden möchte.
– Oskar Persson
25. Oktober um 21:40 Uhr
Ich verstehe Oskar, es ist vollkommen in Ordnung. Wahrscheinlich könnten Sie mit SSH auf die Protokolle zugreifen, wie Sie es konfiguriert haben. Darüber hinaus könnten Sie verwenden Azure-CLI um auf die Protokollinformationen zuzugreifen. Ich bin mir da nicht sicher, aber wahrscheinlich könnten Sie Kudu auch für den Zugriff auf die Containerprotokollinformationen verwenden (bitte versuchen Sie dies zuerst). Siehe diese verwandte SO-Frage. Ich hoffe, es hilft.
– jccampanero
25. Oktober um 21:49 Uhr
Hast du mal chown/chmod probiert
/home/uploads
Ordner, der von Ihrem Webserver und PHP-Linux-Benutzer gelesen/beschrieben werden kann? Können Sie Ihre Apache/Nginx-Konfiguration auf die Option „Symlink folgen“ überprüfen und ggfroot
/rules darf dieser Ordner bedient werden? Haben Sie in htaccess etwas benutzerdefiniertes, das den Zugriff verhindern könnte? Wenn Sie von WP hochladen, wird die Datei erstellt und ist korrekt, aber nicht über HTTP zugänglich, oder? Versuchen Sie es mit einer einfachen txt-Datei mit chmod und überprüften nginx/apache/htaccess/permissions-Konfigurationen.– Mtxz
26. Oktober um 2:49 Uhr
@Mtxz Ich habe chown/chmod im Verzeichnis /home/uploads ausprobiert, aber es scheint überhaupt keine Wirkung zu haben. Ich habe auch versucht, die Apache-Konfiguration zu ändern, indem ich die FollowSymlink-Option hinzugefügt habe, aber auch das bringt nichts. Es ist möglich, dass es mehrere Konfigurationsdateien gibt, in denen ich dies tun muss, aber ich bin mir nicht sicher, welche in diesem Fall. Alles bleibt so wie es im Dockerfile steht, es wird keine andere Konfiguration vorgenommen. Den Quellcode des Basisimages (wordpress:6.0.3-php7.4) finden Sie hier github.com/docker-library/wordpress/tree/master/latest/php7.4/…
– Oskar Persson
26. Oktober um 6:14 Uhr