Ich erstelle ein Docker-Image für meine Symfony
App und muss dem Apache-Server die Berechtigung zum Schreiben in Cache- und Protokollordner erteilen
#Dockerfile
FROM php:7-apache
RUN apt-get update \
&& apt-get install -y libicu-dev freetds-common freetds-bin unixodbc \
&& docker-php-ext-install intl mbstring \
&& a2enmod rewrite
COPY app/php.ini /usr/local/etc/php/
COPY app/apache2.conf /etc/apache2/apache2.conf
COPY ./ /var/www/html
RUN find /var/www/html/ -type d -exec chmod 755 {} \;
RUN find /var/www/html/ -type f -exec chmod 644 {} \;
RUN chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs
Wenn ich dieses Image mit erstelle docker build -t myname/symfony_apps:latest .
und den Container mit ausführe docker run -p 8080:80 myname/symfony_apps:latest
. Das Apache-Protokoll wird von Fehlern überflutet, denen die Berechtigung verweigert wurde. Das Seltsame, mit dem ich nachgefragt habe, ls -a
und die Berechtigungen sind in Ordnung. und wenn ich chmod von Containers Bash aus starte, sind Probleme mit der Apache-Berechtigung verschwunden und die App funktioniert gut
Die Situation
Ausführen von chmod-Befehlen aus der Docker-Datei: Berechtigungen werden geändert, aber Apache beschwert sich weiterhin über verweigerte Berechtigungen. Ausführen von chmod gleichen Befehlen mit bash im Container: Berechtigungen werden geändert und meine App wird ausgeführt
Irgendeine Idee, vermisse ich etwas, vielleicht sollte ich irgendwo in der Docker-Datei Root-Benutzer hinzufügen?
quelle
apache2.conf
) kein Problem verursacht? Verschwinden die Fehler, wenn Sie nicht installierenapache2.conf
?Antworten:
Ich hatte das gleiche Problem und es scheint, dass es einen Fehler in Docker oder Overlay2 gibt, wenn Verzeichnisinhalte in einer Ebene erstellt und deren Berechtigungen in einer anderen geändert werden.
Um dieses Problem zu umgehen, können Sie Quellen in ein temporäres Verzeichnis kopieren:
Verschieben Sie es dann zu
/var/www/html
und richten Sie die Berechtigungen ein (in einemRUN
Befehl):Außerdem habe ich ein GitHub-Problem erstellt .
quelle
Die Standard-Shell von RUN in Docker ist / bin / sh. Hier haben die nicht richtig eingestellten Berechtigungen tatsächlich ein Problem.
Sie können jedoch auch / bin / bash verwenden, um das Problem vor und nach der Verzeichnisliste zu beheben
quelle
/bin/bash -c 'chmod +x file'
funktioniert und nicht/bin/sh -c 'chmod +x file'
?Versuchen Sie hinzuzufügen:
Es hat bei mir funktioniert.
quelle
Dieses Problem ist wahrscheinlich das Ergebnis einer
VOLUME
Definition in der vorgelagerten Docker-Datei. Wenn in der Docker-Datei ein Volume definiert ist, können Sie Dateien mit dem BefehlCOPY
oderADD
direkt zum Image hinzufügen . EineRUN
Zeile wird jedoch:RUN
Befehls auflisten, werden Ihre Änderungen angewendet, aber diese Änderungen wurden auf das Volume angewendetdocker diff
angezeigt, wenn Sie die temporären Container nicht löschen (Sie können einen Build mit ausführen--rm=false
, damit sie erhalten bleiben).Aufgrund dieses Verhaltens haben Sie folgende Möglichkeiten:
Beachten Sie, dass in den aktuellen PHP-Bildern das Volume anscheinend entfernt wurde, was bedeutet, dass wir effektiv Option 3 haben.
quelle
Ich habe gerade ein Experiment mit folgendem gemacht:
Und es funktioniert einfach großartig.
jedoch
Wenn ich diese ausführbare Datei über Docker-Compose-Volumes überschreibe, ist die
execute
Berechtigung einfach wie ein Rollback - technisch überschrieben mit der ursprünglichen Dateiberechtigung.Die Korrektur für den Dev-Modus erfolgt einfach
chmod a+x yourfile
vom Host, der bei der Erstellung des Compose-Volumes vererbt wird.quelle
docker run
Befehl und ohne externe Volume-Bereitstellungen aufgetreten ist.