我有两个泊坞容器: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"无法打开:未能打开流:权限被拒绝
根据我的理解,存储文件夹需要由网络服务器写入 我应该怎么做才能解决这个问题?
答案 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
编译的。
参考 -
答案 1 :(得分:5)
我发现了类似的问题,并通过
进行了修复chown -R www-data:www-data /var/www
chmod -R 755 /var/www/storage
答案 2 :(得分:2)
你可以使用/使用
做3件事sudo chmod 777 storage/ storage/*
文件夹(/home
) RUN chown -R www-data:www-data /var/www
RUN chmod 755 /var/www
将项目文件夹移至/home/projects/
,无需特殊权限即可在该目录上书写(亲自推荐此)(我的使用过/var/www/
并且所有这些都放在那里)。
注意:如果项目位于/home
,那么如果您编写了文件上传文件,那么您也需要获得该文件夹的权限。当您将其移至response = requests.get(url, auth=auth_obj)
答案 3 :(得分:2)
我尝试了所有这些,但没有成功。我的Laravel存储文件夹具有访问权限。但是/var/www/storage
仍未获得许可。
阅读多个建议后,尤其要注意this。我做了以下工作(请注意,php
是我的容器映像的名称,我将laravel项目直接链接到/var/www
):
docker-compose exec php ls -al /var/www/storage
root
可以访问,但是我需要www-data
才能访问。docker-compose exec php chown -R $USER:www-data /var/www/storage
www-data
可以访问存储文件夹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的uid
和gid
,例如:
docker-compose exec nginx id www-data
此命令的输出将如下所示:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
然后,您应该使用这些uid
和gid
在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