使用Laravel& amp的权限被拒绝错误搬运工人

时间:2018-02-05 09:35:53

标签: php laravel docker nginx docker-compose

我有两个泊坞容器: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

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

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

在我的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

成功运行docker-compose后,当我尝试localhost

时出现以下错误
  

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

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

8 个答案:

答案 0 :(得分:14)

使您的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

这使/var/www所拥有的目录www-data成为php-fpm的默认用户。

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

参考 -

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

答案 1 :(得分:5)

我发现了类似的问题,并通过

进行了修复
chown -R www-data:www-data /var/www

chmod -R 755 /var/www/storage

答案 2 :(得分:2)

你可以使用/使用

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

  4. 将项目文件夹移至/home/projects/,无需特殊权限即可在该目录上书写(亲自推荐此)(我的使用过/var/www/并且所有这些都放在那里)。

  5. 注意:如果项目位于/home,那么如果您编写了文件上传文件,那么您也需要获得该文件夹的权限。当您将其移至response = requests.get(url, auth=auth_obj)

    时,这将避免此类错误

答案 3 :(得分:2)

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

阅读多个建议后,尤其要注意this。我做了以下工作(请注意,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应用应该可以。

答案 4 :(得分:1)

在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

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

答案 5 :(得分:0)

您可以右键单击您的laravel文件夹,单击属性,然后单击权限,然后从“组”字段中选择“泊坞窗”,然后将必要的权限授予“泊坞窗”组:) >

答案 6 :(得分:0)

您需要创建一个与您机器上的用户(您创建项目文件的用户)相匹配的用户。因此,在应用程序 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

快速说明:如果您纯粹将 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

奖励: 您可以使用上面的 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']

答案 7 :(得分:-3)

它清楚地说文件夹是不可写的,通常在Linux中我们需要给予许可

以下是您可以使用的方式

sudo chmod -Rf 777 "/var/www/storage/logs/laravel.log