Permission Denied-Fehler bei Verwendung von Laravel und Docker

Lesezeit: 6 Minuten

Benutzer-Avatar
Anand Naik B

Ich habe zwei Docker-Container: Nginx und App.
Der App-Container erweitert PHP-fpm und hat auch meinen Laravel-Code.

In meinem docker-compose.yml Ich mache:

version: '2'
services:
    nginx:
        build:
            context: ./nginx
            dockerfile: ./Dockerfile
        ports:
            - "80:80"
        links:
            - app
    app:
        build:
            context: ./app
            dockerfile: ./Dockerfile

In meinem Nginx Dockerfile mache ich:

FROM nginx:latest
WORKDIR /var/www
ADD ./nginx.conf /etc/nginx/conf.d/default.conf
ADD . /var/www
EXPOSE 80

In meiner App Dockerfile mache ich:

FROM php:7-fpm
WORKDIR /var/www
RUN apt-get update && apt-get install -y libmcrypt-dev mysql-client && docker-php-ext-install mcrypt pdo_mysql
ADD . /var/www

Nachdem ich docker-compose up erfolgreich ausgeführt habe, erhalte ich den folgenden Fehler, wenn ich localhost versuche

Der Stream oder die Datei „/var/www/storage/logs/laravel.log“ konnte nicht geöffnet werden: Stream konnte nicht geöffnet werden: Berechtigung verweigert

Nach meinem Verständnis muss der Speicherordner vom Webserver beschreibbar sein.
Was soll ich tun, um dies zu beheben?

Machen Sie Ihr Dockerfile wie folgt –

FROM php:7-fpm
WORKDIR /var/www
RUN apt-get update && apt-get install -y libmcrypt-dev mysql-client && docker-php-ext-install mcrypt pdo_mysql
ADD . /var/www
RUN chown -R www-data:www-data /var/www

Dies macht Verzeichnis /var/www gehört www-data das ist der Standardbenutzer für php-fpm.

Da es mit user kompiliert wird www-data.

Ref-

https://github.com/docker-library/php/blob/57b41cfc2d1e07acab2e60d59a0cb19d83056fc1/7.0/jessie/fpm/Dockerfile

  • Das hat bei mir nicht funktioniert. Gleicher Fehler. Jeder hat eine Idee.

    – Janaka Pushpakumara

    23. April 2018 um 8:10 Uhr

  • Ich habe auch das gleiche Problem. Auch diese Lösung hat bei mir nicht funktioniert.

    – Marcelo Noguti

    7. Mai 2018 um 19:27 Uhr

  • Du kannst den … benutzen --chown Flagge auf der ADD oder COPY Anweisung zum Verkleinern der Bildgröße. Wie COPY --chown=www-data:www-data . /var/www. In meinem Fall wurde die Größe des Bildes von 130 MB auf 100 MB reduziert.

    – J. Eggerstedt

    27. Mai 2018 um 10:38 Uhr

  • Für mich musste ich mit diesem Befehl in den Container selbst eintauchen docker exec -i -t (here is you container id) bash

    – FerdousTheWebCoder

    28. Januar 2019 um 20:45 Uhr

  • Habe einen Artikel gefunden, der den Grund dafür erklärt. Das Problem bei mir – war, dass ich Linux benutze – github.com/shipping-docker/vessel-docs/blob/master/source/docs/…

    – Naneri

    10. März 2019 um 13:29 Uhr

Ich habe ein ähnliches Problem gefunden und es behoben

chown -R www-data:www-data /var/www

chmod -R 755 /var/www/storage

  • Ich erhalte: “Zugriff auf ‘/var/www/storage’ nicht möglich: Keine solche Datei oder Verzeichnis”

    – Naneri

    23. September 2018 um 19:31 Uhr

Benutzer-Avatar
Hamid Mohayeji

Bei der Verwendung von Bind-Mounts in Docker bleiben die ursprünglichen Berechtigungen im Docker-Host im Container erhalten. Dies ermöglicht es uns, entsprechende Berechtigungen auf dem Docker-Host festzulegen, die innerhalb des Containers verwendet werden.

Zuerst sollten Sie die finden uid und gid von nginx, zum Beispiel:

docker-compose exec nginx id www-data

Die Ausgabe dieses Befehls würde in etwa so aussehen:

uid=33(www-data) gid=33(www-data) groups=33(www-data)

Dann sollten Sie diese verwenden uid und gid um Berechtigungen für den Docker-Host festzulegen, die auch vom Container verwendet werden. Führen Sie also den folgenden Befehl auf dem Docker-Host aus:

sudo chown -R 33:33 site

Jetzt muss alles funktionieren.

  • Vielen Dank! Das können Sie übrigens ganz einfach in Ihrem Dockerfile durchführen, indem Sie die Daten mit hineinkopieren COPY --chown=33:33 . .. Dadurch bleibt das Eigentum an den Originaldateien erhalten. (Ich habe jedoch gelesen, dass dies unter Windows nicht funktioniert.)

    – Cameron Hudson

    17. Juni 2019 um 0:03 Uhr

  • vielleicht docker exec statt docker-compose exec?

    – Naneri

    24. Juni 2019 um 12:14 Uhr

Benutzer-Avatar
Abdulla Nilam

Sie können 3 Dinge tun, die ich verwendet habe

  1. Erteilen Sie 755 die Berechtigung zu storage Mappe (sudo chmod 755 storage/ storage/* )

  2. RUN chown -R www-data:www-data /var/www RUN chmod 755 /var/www

  3. Projektordner verschieben nach /home was keine besondere Berechtigung erfordert, um in dieses Verzeichnis zu schreiben (Empfehlen Sie dies persönlich) (In meiner habe ich verwendet /home/projects/ und alle dort platziert).


Notiz: Wenn das Projekt drin ist /var/www/ Wenn Sie dann auch Datei-Upload geschrieben haben, benötigen Sie auch die Berechtigung für diese Ordner. Dadurch wird ein solcher Fehler beim Verschieben vermieden /home

Ich habe all dies versucht, und es hat nicht funktioniert. Mein Laravel-Speicherordner hatte Zugriff. Aber /var/www/storage hatte immer noch keine Erlaubnis.

Nach dem Lesen mehrerer Vorschläge, insbesondere mit diesem. Ich habe Folgendes getan (bitte beachten Sie das php ist der Name meines Container-Images, und ich habe mein Laravel-Projekt direkt damit verknüpft /var/www):

  1. Von meinem Docker bin ich gerannt docker-compose exec php ls -al /var/www/storage
    • Ich habe nur das gesehen root hatte Zugriff, aber ich brauche www-data Zugriff zu haben.
  2. Dann rannte ich docker-compose exec php chown -R $USER:www-data /var/www/storage
    • Das gibt www-data Zugriff auf den Speicherordner
  3. Dann rannte ich docker-compose exec php chown -R $USER:www-data /var/www/bootstrap/cache
    • Das gibt www-data Zugriff auf den Bootstrap/Cache-Ordner

Wenn Sie Punkt 1 erneut ausführen, www-data sollte Zugriff haben, und Ihre Laravel-App sollte in Ordnung sein.

Benutzer-Avatar
Essana3

Sie müssen einen Benutzer erstellen, der mit dem auf Ihrem Computer übereinstimmt (mit dem Sie die Projektdateien erstellt haben). Ändern Sie also in der App Dockerfile Ihre Datei wie folgt:

FROM php:fpm

# Arguments defined in docker-compose.yml
ARG user
ARG uid

# Install system dependencies
RUN apt-get update && apt-get install -y libmcrypt-dev mysql-client

# Install PHP extensions
RUN docker-php-ext-install mcrypt pdo_mysql

# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
    chown -R $user:$user /home/$user

# Set working directory
WORKDIR /var/www

# Set the user
USER $user

# Copy your files
COPY . . # You can use "." as a destination since you already changed the workdir

Kurzer Hinweis: Wenn Sie Docker nur für die lokale Entwicklung verwenden, müssen Sie nichts kopieren, sondern nur Bind-Mounts verwenden.

Nehmen Sie in Ihrer Docker-Compose-Datei die folgenden Änderungen vor:

app:
    build:
        args:
            user: essana3 # your username on your machine, you can get it by running echo $USER
            uid: 1000 # your uid which you can get by running id -u
        context: ./app
        dockerfile: Dockerfile # if your dockerfile is called Dockerfile, you don't need to add the dockerfile option
    volumes:
        - ./app:/var/www

BONUS: Sie können die Docker-Datei oben verwenden, um Utility-Container in Ihrer Docker-Compose-Datei zu erstellen, um Artisan- und Composer-Befehle auszuführen:

  composer:
    build:
      args:
        user: essana3 # your username (echo $USER)
        uid: 1000 # your uid (id -u)
      context: ./app
    working_dir: /var/www
    volumes:
      - ./app:/var/www
    entrypoint: ['composer']

  artisan:
    build:
      args:
        user: essana3 # your username (echo $USER)
        uid: 1000 # your uid (id -u)
      context: ./app
    working_dir: /var/www
    volumes:
      - ./app:/var/www
    entrypoint: ['php', 'artisan']

Benutzer-Avatar
königlich127

Sie können einfach mit der rechten Maustaste auf Ihren Laravel-Ordner klicken, auf Eigenschaften und dann auf Berechtigungen klicken und im Feld „Gruppe“ den „Docker“ auswählen und der Gruppe „Docker“ die erforderlichen Berechtigungen erteilen 🙂 Das funktioniert für mich

  • Hier steht Docker im Kontext. Alles wird über das Terminal gesteuert, nicht über die GUI

    – Dinesh Suthar

    18. November 2020 um 9:21 Uhr

1204650cookie-checkPermission Denied-Fehler bei Verwendung von Laravel und Docker

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

Privacy policy