使用Laravel和Docker的权限被拒绝错误

Ana*_*k B 11 php nginx laravel docker docker-compose

我有两个docker容器:Nginx和App.
app容器扩展了PHP-fpm并且还有我的Laravel代码.

在我的docker-compose.yml工作中:

version: '2'
services:
    nginx:
        build:
            context: ./nginx
            dockerfile: ./Dockerfile
        ports:
            - "80:80"
        links:
            - app
    app:
        build:
            context: ./app
            dockerfile: ./Dockerfile
Run Code Online (Sandbox Code Playgroud)

在我的Nginx Dockerfile中,我正在做:

FROM nginx:latest
WORKDIR /var/www
ADD ./nginx.conf /etc/nginx/conf.d/default.conf
ADD . /var/www
EXPOSE 80
Run Code Online (Sandbox Code Playgroud)

在我的App Dockerfile中,我正在做:

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 Code Online (Sandbox Code Playgroud)

在成功运行docker-compose之后,当我尝试localhost时出现以下错误

无法打开流或文件"/var/www/storage/logs/laravel.log":无法打开流:权限被拒绝

根据我的理解,存储文件夹需要由Web服务器写入.
我应该怎么做才能解决这个问题?

viv*_*d4v 21

使你的Dockerfile如下 -

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
Run Code Online (Sandbox Code Playgroud)

这使得目录/var/www所拥有的www-data是默认用户php-fpm.

因为它是用户编译的www-data.

REF-

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

  • 这不适合我.同样的错误.任何人都有任何想法. (6认同)
  • 对我来说,我不得不使用这个命令`docker exec -i -t (here is you container id) bash`深入到容器本身 (4认同)
  • 我也有同样的问题。这个解决方案对我也不起作用。 (2认同)
  • 您可以在“添加”或“复制”指令上使用“ --chown”标志来减小图像尺寸。就像`COPY --chown = www-data:www-data。/ var / www`。以我为例,图像的大小从130MB减少到100MB。 (2认同)
  • 找到一篇文章解释了这背后的原因。我的问题是 - 我正在使用 Linux - https://github.com/shipping-docker/vessel-docs/blob/master/source/docs/linux-permissions.md (2认同)

Kha*_*aen 7

我发现了类似的问题,我修复了它

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

chmod -R 755 /var/www/storage
Run Code Online (Sandbox Code Playgroud)

  • 我得到:“无法访问'/ var / www / storage':没有这样的文件或目录” (4认同)

Bun*_*nka 7

我尝试了所有这些,但没有成功。我的 Laravel 存储文件夹具有访问权限。但/var/www/storage还是没有得到许可。

在阅读了多个建议后,尤其是这个。我执行了以下操作(请注意,这php是我的容器映像的名称,并且我将我的 laravel 项目直接链接到/var/www):

  1. 从我的码头工人那里,我跑了docker-compose exec php ls -al /var/www/storage
    • 我看到只有root访问权限,但我需要www-data访问权限。
  2. 然后我跑了docker-compose exec php chown -R $USER:www-data /var/www/storage
    • 这允许www-data访问存储文件夹
  3. 然后我跑了docker-compose exec php chown -R $USER:www-data /var/www/bootstrap/cache
    • 这可以www-data访问 bootstrap/cache 文件夹

如果您再次运行第 1 项,www-data应该可以访问,并且您的 Laravel 应用程序应该没问题。


小智 7

您需要创建一个与您计算机上的用户(您用来创建项目文件的用户)相匹配的用户。因此,在应用程序 Dockerfile 中,像这样更改文件:

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
Run Code Online (Sandbox Code Playgroud)

快速注意:如果您纯粹使用 docker 进行本地开发,则无需复制任何内容,只需使用绑定挂载即可。

在 docker-compose 文件中进行以下更改:

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
Run Code Online (Sandbox Code Playgroud)

奖励:您可以使用上面的 dockerfile 在 docker-compose 文件中创建实用程序容器来运行 artisan 和composer 命令:

  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']
Run Code Online (Sandbox Code Playgroud)


Abd*_*lam 6

我可以使用/使用时做三件事

  1. 将777权限授予storage文件夹(sudo chmod 777 storage/ storage/*
  2. RUN chown -R www-data:www-data /var/www RUN chmod 755 /var/www

  3. /home不需要特殊权限的项目文件夹移动到该目录上(需要我个人推荐)(在我使用的我的文件夹中,所有这些文件夹/home/projects/都放置在该文件夹中)。


注意:如果项目在中,/var/www/那么如果您编写了文件上传,则也需要该文件夹的权限。当您将其移动到/home

  • 只是一个想法,但是777是Web服务器文件夹的不安全权限设置。一种建议是改用“ ug + rw”之类的东西(为USER(所有者)和GROUP添加READ和WRITE)。 (2认同)

Ham*_*eji 6

在Docker中使用绑定安装时,Docker主机中的原始权限保留在容器中。这使我们能够在Docker主机上设置适当的权限,以在容器内使用。

首先,您应该找到nginx 的uidgid,例如:

docker-compose exec nginx id www-data

该命令的输出将如下所示:

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

然后,您应该使用它们uidgid在Docker主机上设置权限,该权限也将由容器使用。因此,在Docker主机上运行以下命令:

sudo chown -R 33:33 site

现在一切都必须正常工作。