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

lrpiutwd  于 2023-02-03  发布在  Docker
关注(0)|答案(8)|浏览(300)

这是我的文件夹结构:

+-- root-app-dir
|   +-- docker
|   |   +-- Dockerfile
|   |   +-- nginx.conf
|   +-- src // this is where the Laravel app lives
|   +-- docker-compose.yml

这是我的docker-compose.yml

version: '2'

services:
  app:
    build:
      context: ./docker
      dockerfile: Dockerfile
    image: lykos/laravel
    volumes:
      - ./src/:/var/www/html/
    networks:
      - app-network

  nginx:
    image: nginx:latest
    volumes:
      - ./src/:/var/www/html/
      - ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - 8000:80
    networks:
      - app-network

  mysql:
    image: mysql:5.7
    ports: 
      - "4306:3306"
    environment:
      MYSQL_DATABASE: homestead
      MYSQL_USER: homestead
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      - mysqldata:/var/lib/mysql
    networks:
      - app-network

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
      - 8080:80
    links:
      - mysql
    environment:
      PMA_HOST: mysql

volumes:
  mysqldata:
    driver: "local"

networks:
  app-network:
    driver: "bridge"

这是我的nginx. conf

server {
  root /var/www/html/public;

  index index.html index.htm index.php;

  server_name _;
  charset utf-8;

  location = /favicon.ico { log_not_found off; access_log off; }
  location = /robots.txt { log_not_found off; access_log off; }

  location / {
    try_files $uri $uri/ /index.php$is_args$args;
  }

  location ~ \.php$ {
    # include snippets/fastcgi-php.conf;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_pass app:9000;
    fastcgi_index index.php;
  }

  error_page 404 /index.php;

  location ~ /\.ht {
    deny all;
  }
}

当我运行docker-compose up -d并尝试通过htts://localhost:8000访问Laravel应用程序时,屏幕上出现此错误

UnexpectedValueException
The stream or file "/var/www/html/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied

我已经从我的root-app-dir运行sudo chown lykos:lykos -R ./src,但问题仍然存在。我该如何解决这个问题?

nwlqm0z1

nwlqm0z11#

如果这上面不工作当它被添加到你的.env文件以下将:

sudo chmod o+w ./storage/ -R

这将在不更改用户和组权限的情况下给予其他人权限。

drnojrws

drnojrws2#

有几个选项,哪些可能是错误的:

  1. storage链接设置不正确,您可以阅读here,启动app容器后,应执行php artisan storage:link检查是否存在正确的链接
    1.您没有给定文件夹的适当权限,默认情况下,logs文件夹应具有www-data可写权限,您可以通过ssh到机器并在/var/www/html/[your laravel app]中的文件上执行ls -l来检查,如果没有,请通过以下操作添加适当权限:chown -R www-data:www-data *
    1.也与文件权限相关:您可以通过检查以下状态禁用SELinux(但只能在开发服务器中禁用,切勿在现场禁用):sestatus,然后通过setenforce 0将其强制为0(但是在实时服务器上,最好让SElinux保持运行,并尝试通过chcon -R -t httpd_sys_rw_content_t [path to storage folder here]来消除问题
ih99xse1

ih99xse13#

如果你正在使用laravel sail,添加以下到你的.env文件

WWWGROUP=1000
WWWUSER=1000
p3rjfoxz

p3rjfoxz4#

如果您在Docker Windows桌面上使用Sail和WSL2,当您直接从 Jmeter 板启动Docker容器时会出现此问题。相反,在您的WSL2终端示例中启动容器,即

sail up -d
ff29svar

ff29svar5#

1.使用用户root:root。您可以尝试使用命令:
sudo chmod -R 777存储/
1.使用用户www-data:www-data。尝试使用命令:
sudo chown -R www-数据:www-数据存储/
sudo chmod -R 755存储器/
1.如果你用Docker,你试试命令:
存储空间-R nginx:nginx存储空间/
sudo chmod -R 755存储器/

rta7y2nd

rta7y2nd6#

下面的工作对我来说,执行两个命令在以下序列在WSL 2命令行,希望这个案例能帮助别人
1:@nam-sama给出的答案

With user root:root . You try with command :

sudo chmod -R 777 storage/

第二个问题:@Rob-Mascaro给出的答案

sail up -d
44u64gxh

44u64gxh7#

只是为了更多地强调Toosche's answer。我在尝试部署Docker PHP应用程序时遇到了这个问题。
我的工作目录是/var/www/html,我在Dockerfile中添加了创建名为docker的USER的命令。
在我的Dockerfile中已经有了以下命令:

RUN sudo chown -R www-data:www-data /var/www/html \
    && sudo chmod 777 -R /var/www/html \

以及启动脚本中的以下命令:

chmod -R ugo+rw /.composer
chown -R $USER:www-data /var/www/html/storage/
chown -R $USER:www-data /var/www/html/bootstrap/cache/
chmod -R 775 /var/www/html/storage/
chmod -R 775 /var/www/html/bootstrap/cache/

部署后,我得到下面的错误,当我尝试使用该应用程序:
无法在附加模式下打开流或文件"/var/www/html/storage/logs/laravel-2023-02-01.log ":无法打开流:权限被拒绝\n尝试记录时出现异常:数据流或文件"/var/www/html/storage/logs/laravel-2023 - 02 - 01.log\

    • 我是这么解决的**

容器在启动后会逐个创建/var/www/html/storage/logs/laravel.log。所以我检查了正在运行的容器中的文件和文件夹的所有权,发现了以下内容:

-rw-r--r-- 1 www-data www-data    515 Feb  2 00:09 README.md
drwxr-xr-x 1 www-data www-data   4096 Feb  2 00:09 app
-rwxr-xr-x 1 www-data www-data   1686 Feb  2 00:09 artisan
drwxr-xr-x 1 www-data www-data   4096 Feb  2 00:09 bootstrap
-rw-r--r-- 1 www-data www-data   2098 Feb  2 00:09 composer.json
-rw-r--r-- 1 www-data www-data 312509 Feb  2 00:09 composer.lock
drwxr-xr-x 1 www-data www-data   4096 Feb  2 00:09 config
-rw-r--r-- 1 www-data www-data 726014 Feb  2 00:09 package-lock.json
-rw-r--r-- 1 www-data www-data    473 Feb  2 00:09 package.json
-rw-r--r-- 1 www-data www-data   1202 Feb  2 00:09 phpunit.xml
drwxr-xr-x 1 www-data www-data   4096 Feb  2 00:09 public
drwxr-xr-x 1 www-data www-data   4096 Feb  2 00:09 resources
drwxr-xr-x 1 www-data www-data   4096 Feb  2 00:09 routes
-rw-r--r-- 1 www-data www-data    563 Feb  2 00:09 server.php
drwxr-xr-x 1 root     root       4096 Feb  2 00:09 storage
drwxr-xr-x 1 www-data www-data   4096 Feb  2 00:09 tests
drwxr-xr-x 1 www-data www-data   4096 Feb  2 00:09 vendor
-rw-r--r-- 1 www-data www-data    559 Feb  2 00:09 webpack.mix.js

要解决这个问题并删除重复的命令,我所要做的就是在Dockerfile和启动脚本中删除上面的命令,并在启动脚本中只添加下面的命令,这将授予www-data用户和组对工作目录中所有文件和文件夹的权限:

chown -R www-data:www-data *

我还在composer的启动脚本中保留了以下命令:

chmod -R ugo+rw /.composer

之后我再次构建并重新部署了应用程序。这次我检查了运行容器中的文件和文件夹所有权,它们很好,如下所示:

-rw-r--r-- 1 www-data www-data    515 Feb  2 00:09 README.md
drwxr-xr-x 1 www-data www-data   4096 Feb  2 00:09 app
-rwxr-xr-x 1 www-data www-data   1686 Feb  2 00:09 artisan
drwxr-xr-x 1 www-data www-data   4096 Feb  2 00:09 bootstrap
-rw-r--r-- 1 www-data www-data   2098 Feb  2 00:09 composer.json
-rw-r--r-- 1 www-data www-data 312509 Feb  2 00:09 composer.lock
drwxr-xr-x 1 www-data www-data   4096 Feb  2 00:09 config
-rw-r--r-- 1 www-data www-data 726014 Feb  2 00:09 package-lock.json
-rw-r--r-- 1 www-data www-data    473 Feb  2 00:09 package.json
-rw-r--r-- 1 www-data www-data   1202 Feb  2 00:09 phpunit.xml
drwxr-xr-x 1 www-data www-data   4096 Feb  2 00:09 public
drwxr-xr-x 1 www-data www-data   4096 Feb  2 00:09 resources
drwxr-xr-x 1 www-data www-data   4096 Feb  2 00:09 routes
-rw-r--r-- 1 www-data www-data    563 Feb  2 00:09 server.php
drwxr-xr-x 1 www-data www-data   4096 Feb  2 00:09 storage
drwxr-xr-x 1 www-data www-data   4096 Feb  2 00:09 tests
drwxr-xr-x 1 www-data www-data   4096 Feb  2 00:09 vendor
-rw-r--r-- 1 www-data www-data    559 Feb  2 00:09 webpack.mix.js
du7egjpx

du7egjpx8#

我遇到这个问题是因为我使用的是sail,而日志的默认目录认为我使用的是Apache。我找不到任何方法将日志位置更改为正确的存储文件夹,所以我创建了一个符号链接:

ln -s /var/www/html/public/storage /home/<yourfoldername>/storage

当我再次运行我的脚本时,它正确地出错了,并写入了正确位置的laravel.log文件

相关问题