chmod funktioniert im Docker nicht richtig

Ich baue ein Docker-Image für mein Symfony app und ich müssen dem Apache-Server die Erlaubnis erteilen, in Cache- und Protokollordner zu schreiben

#DockerfileFROM php:7-apacheRUN apt-get update \&& apt-get install -y libicu-dev  freetds-common freetds-bin unixodbc \&& docker-php-ext-install intl mbstring \&& a2enmod rewriteCOPY app/php.ini /usr/local/etc/php/COPY app/apache2.conf /etc/apache2/apache2.confCOPY ./ /var/www/htmlRUN 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 Bild mit baue docker build -t myname/symfony_apps:latest . und führen Sie den Container mit aus docker run -p 8080:80 myname/symfony_apps:latest.Das Apache-Protokoll wird von Permission Denied-Fehlern überflutet, die seltsame Sache, mit der ich überprüft habe ls -a und Berechtigungen sind in Ordnung. und wenn ich chmod von der Bash des Containers aus starte, sind Apache-Berechtigungsprobleme verschwunden und die App funktioniert gut

Situation

Ausführen von chmod-Befehlen aus dockerfile: berechtigungen werden geändert, aber Apache beschwert sich immer noch über die verweigerte Berechtigung.Ausführen von chmod-Befehlen mit Bash im Container: berechtigungen werden geändert und meine App wird ausgeführt

Irgendeine Idee, fehlt mir etwas, vielleicht sollte ich irgendwo in der Docker-Datei einen Root-Benutzer hinzufügen?

Ich hatte das gleiche Problem und es scheint, dass es einen Fehler in Docker oder overlay2 gibt, wenn Verzeichnisinhalt in einer Ebene erstellt und seine Berechtigungen in einer anderen geändert werden.

Als Problemumgehung können Sie Quellen in ein temporäres Verzeichnis kopieren:

COPY . /src

Und verschiebe es dann zu /var/www/html und Setup-Berechtigungen (in einem RUN Befehl):

RUN rm -rf /var/www/html && mv /src /var/www/html &&\    find /var/www/html/ -type d -exec chmod 755 {} \; &&\    find /var/www/html/ -type f -exec chmod 644 {} \; &&\    chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs

Auch ich habe erstellt GitHub-Problem.

Versuchen Sie hinzuzufügen :

USER root

Es hat bei mir funktioniert.

Die Standard-Shell von RUN in Docker ist / bin / sh und hier haben die nicht richtig gesetzten Berechtigungen tatsächlich ein Problem.

Sie können jedoch ändern, um stattdessen einfach /bin / bash zu verwenden, um das Problem vor und nach der Verzeichnisliste zu beheben

Step 7/9 : RUN /bin/bash -c 'ls -la; chmod +x gitlab-properties-builder.sh; ls -la'---> Running in dc57ae77aa67drwxr-xr-x. 3 root root      103 Mar  8 17:56 .drwxr-xr-x. 1 root root       46 Mar  8 17:57 ..drwxr-xr-x. 2 root root        6 Mar  7 20:47 config-rw-r--r--. 1 root root     2340 Mar  7 21:20 gitlab-properties-builder.sh-rw-r--r--. 5 root root 57325770 Mar  5 14:39 gitlab-scm-collector-2.0.5-SNAPSHOT.jardrwxr-xr-x. 1 root root       42 Mar  8 17:56 .drwxr-xr-x. 1 root root       61 Mar  8 17:57 ..drwxr-xr-x. 2 root root        6 Mar  7 20:47 config-rwxr-xr-x. 1 root root     2340 Mar  7 21:20 gitlab-properties-builder.sh-rw-r--r--. 5 root root 57325770 Mar  5 14:39 gitlab-scm-collector-2.0.5-SNAPSHOT.jar---> 8b5de6e348d3

Dieses Problem ist wahrscheinlich das Ergebnis eines VOLUME definition innerhalb der Upstream-Dockerdatei. Wenn in der Docker-Datei ein Volume definiert ist, können Sie Dateien mit einem hinzufügen COPY oder ADD befehl direkt in das Bild. Jedoch, ein RUN linie wird:

  • Erstellen Sie einen temporären Container mit der Bilddefinition ab dem aktuellen Punkt der Docker-Datei
    • In diesem temporären Container wird ein anonymes Volume als Sie oder ein übergeordnetes Image bereitgestellt, das in der Docker-Datei angegeben ist
    • Das anonyme Volume wird aus dem Inhalt des Images initialisiert
  • Ihr Befehl wird im Container ausgeführt
    • Wenn Sie das Verzeichnis währenddessen auflisten RUN befehl sehen Sie Ihre Änderungen angewendet, aber diese Änderungen wurden auf das Volume angewendet
  • Wenn Ihr Befehl Ausführen abgeschlossen ist, erfasst Docker die Änderungen am Container
    • Diese Veränderungen können mit einem docker diff wenn Sie die temporären Container nicht löschen (Sie können einen Build mit ausführen --rm=false um sie bleiben zu lassen)
    • Diese Änderungen umfassen nicht den Inhalt des anonymen Volumes, da sie nicht im temporären Containerdateisystem vorhanden sind, Volumes sind getrennt

Aufgrund dieses Verhaltens haben Sie folgende Möglichkeiten:

  1. sie können Ihre Dateien in ein anderes Verzeichnis kopieren und dort die Berechtigungen ändern
  2. sie können die Berechtigungen auf Ihrem Host korrigieren, damit sie direkt mit diesen Berechtigungen kopiert werden
  3. sie können das Volume entweder aus Ihrem Image entfernen, das Upstream-Image veranlassen, die Volumendefinition zu entfernen, oder Sie können Ihre eigene Kopie des Upstream-Images ohne die Volumendefinition neu erstellen und Ihre Bilder darauf aufbauen

Beachten Sie, dass in den aktuellen PHP-Images anscheinend das Volume entfernt wurde, was bedeutet, dass wir effektiv Option 3 haben.

Ich habe gerade ein Experiment mit Folgendem gemacht:

FROM alpineLABEL MAINTAINER="YIMGA YIMGA Salathiel Genèse"RUN apk add --no-cache inotify-toolsCMD [ "./script.sh" ]WORKDIR /opt/app/COPY src/ /opt/app/RUN chmod a+x *.sh

Und es funktioniert einfach großartig.

Jedoch

Wenn ich diese ausführbare Datei über docker-Compose-Volumes überschreibe, wird die execute die Berechtigung ist einfach wie ein Rollback - technisch überschrieben mit der ursprünglichen Dateiberechtigung.

Der Fix für den Entwicklermodus ist einfach zu chmod a+x yourfile vom Host, der beim Compose-Volume-Mounten geerbt wird.

In Ordnung… Ich habe die Frage bearbeitet :slight_smile:

Ich sehe ein zusätzliches Leerzeichen in Ihrem letzten Befehl (ich bin auf meinem Handy, also kann ich nicht sicher sein). Da das Berechtigungsproblem mit dem Protokollverzeichnis zu liegen scheint, ändern Sie die letzte Zeile in: ``
FÜHREN SIE chmod -R 777 /var/ www/html/app/ cache /var/www/html/app/logs AUS

dieser zusätzliche Platz war ein Tippfehler

Hast du das Problem gelöst?

Ich kann Ihr Problem nicht reproduzieren. Wenn ich Ihre Docker-Datei verwende und einige Dummy-Dateien lokal einrichte, sind die Berechtigungen korrekt und alles funktioniert einfach. Ich kann einen Container booten und über einen Webbrowser auf Inhalte zugreifen. Können Sie Ihre Frage aktualisieren, um bestimmte Fehlermeldungen aufzunehmen? Sind Sie sicher, dass Ihre Apache-Konfiguration 'apache2.conf') verursacht kein Problem? Verschwinden die Fehler, wenn Sie 'apache2.conf?

Es wäre hilfreich, Ihren Docker-Befehl zu sehen, der das erstellte Image ausführt.