Docker Laravel - 无法以附加模式打开:无法打开流:权限被拒绝

问题描述 投票:0回答:5

现在几乎一整天都在尝试修复这个错误,不知道是什么导致了这个问题。

我得到的错误是:UnexpectedValueException 无法以附加模式打开流或文件“/var/www/storage/logs/laravel.log”:无法打开流:权限被拒绝

下面是我的 docker-compose.yml、Dockerfile 和 conf.d 文件。

docker-compose.yml:

version: "3"
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: /laravelproject
    container_name: app
    restart: unless-stopped
    volumes:
      - ./:/var/www
      - ./config/php/local.ini:/usr/local/etc/php/conf.d/local.ini

  webserver:
    build:
      context: .
      dockerfile: Dockerfile_Nginx
    image: /nginx
    container_name: webserver
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - ./:/var/www
      - ./config/nginx/conf.d/:/etc/nginx/conf.d/
    depends_on:
      - app

Docker文件:

FROM php:7.3-fpm-alpine

WORKDIR /var/www

RUN apk update && apk add \
    build-base \
    freetype-dev \
    libjpeg-turbo-dev \
    libpng-dev \
    libzip-dev \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl

RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
RUN docker-php-ext-install gd

# copy config
COPY ./config/php/local.ini /usr/local/etc/php/conf.d/local.ini

RUN addgroup -g 1000 -S www && \
    adduser -u 1000 -S www -G www

USER www

COPY --chown=www-data:www-data . /var/www

EXPOSE 9000

app.conf:

server{
    listen 80;
    index index.php index.html;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/public;
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

我尝试了很多解决方案,但没有一个有效。

谢谢。

laravel docker
5个回答
1
投票

您需要确保 docker 容器内的用户与拥有主机上文件的用户使用相同的

uid
gid
运行。

您可以使用

检查容器用户权限
docker-compose exec <service-name> ls -la /path/to/app/directory

在你的例子中,路径是

/var/www/

然后检查主机的用户权限

ls -la /path/to/host/mount/point

在你的例子中,路径是

./

要测试它,您只需将

uid
中的
gid
Dockerfile
更改为与主机上的用户相同,它应该可以工作。 为了能够通过您的
docker-compose.yml
传递此数据,您可以将
build-args
添加到您的撰写文件中,如 int Documentation.

你也可以复习一下 Laravel Sail 的做法。


1
投票

我在 Windows 10 上使用 Docker Desktop 和 Laravel 遇到了这个问题。我遇到了文件权限问题。即:

file_put_contents(...): failed to open stream: No such file or directory
.

编辑权限将允许我使用 artisan 命令创建文件,但会阻止我使用 Visual Studio Code 在本地实际编辑文件(反之亦然)。

很多搜索都没有产生有用的结果,直到我找到这篇关于这个问题的帖子:https://github.com/laravel/sail/issues/81#issuecomment-1304499939

问题可以通过使用docker桌面中的GUI播放按钮启动容器来复制。

这个问题可以通过从命令行启动你的容器来避免:

    sail up -d

-d 标志是可选的(在后台运行它)。通过命令行(而不是使用 Docker Desktop 客户端播放按钮)以这种方式启动后 - 权限问题消失了。我能发现的主要区别是,如果使用 Docker Desktop 启动容器,则在容器内 the

Group:User == 1000:sail.

如果使用命令

sail up -d
,在容器内

Group:User == sail:sail.

您可以通过开始使用这两种方法并运行

sail root-shell
来确认自己,然后在容器中一次
ls -ll
.


0
投票

你的问题的答案确实很简单。

首先,请记住 docker 默认以 root 身份运行 因此在创建容器期间执行的所有操作都是由 root 用户完成的。

发生的事情是您在切换到新创建的

www
用户后运行命令COPY --chown=www-data:www-data . /var/www:该用户无权更改root拥有的文件夹的所有者!

另一个错误是你要设置文件夹所有权的用户不是 www-data 而是你刚刚创建的 www 用户。

最后,你想要的是调换 2 个命令的顺序,将用户从 www-data 更改为 www,如下所示:

改变这个

USER www

COPY --chown=www-data:www-data . /var/www

进入这个

COPY --chown=www:www . /var/www

USER www

0
投票

对我有用的是以下

我在容器内登录并删除了现有的 laravel.log 文件

docker exec -it 0a6ea1039145 bash

root@0a6ea1039145:/var/www/html/storage/logs# ls -la
-rwxrwxrwx 1 1000 sail    14 Apr  2 21:21 .gitignore
-rw-r--r-- 1 1000 sail 41664 Apr  3 20:41 laravel.log

root@0a6ea1039145:/var/www/html/storage/logs# rm laravel.log

-1
投票

试试这个:

FROM php:7.3-fpm-alpine

WORKDIR /var/www

RUN apk update && apk add \
    build-base \
    freetype-dev \
    libjpeg-turbo-dev \
    libpng-dev \
    libzip-dev \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl

RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
RUN docker-php-ext-install gd

# copy config
COPY ./config/php/local.ini /usr/local/etc/php/conf.d/local.ini

RUN addgroup -g 1000 -S www && \
    adduser -u 1000 -S www -G www

#USER root

COPY --chown=www:www-data . /var/www

RUN chown -R www:www-data /var/www/storage
RUN chmod -R ug+w /var/www/storage

EXPOSE 9000

登录集装箱码头,检查目录和文件权限

>ls -al

drw-r--r-- 1 www www-data      0 Apr 25 11:57 storage
-rwxrw-rw- 1 www www-data 34434 Apr 25 12:45 laravel.log

此外,php-fpm 必须由

www-data
用户执行。

>top

17 root      20   0  236968   8232   2140 S   0.0   0.0   0:00.00 php-fpm7.3 
18 www-data  20   0  236968   8264   2164 S   0.0   0.0   0:00.00 php-fpm7.3 
19 www-data  20   0  236968   8264   2164 S   0.0   0.0   0:00.00 php-fpm7.3 

如果不是这种情况,则使用 www-data.conf 文件覆盖 /etc/php/7.3/fpm/pool.d 目录(复制或挂载为卷)

[www-data.conf]

user = www-data
group = www-data

listen = /run/php/php7.3-fpm.sock

listen.owner = www-data
listen.group = www-data

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
© www.soinside.com 2019 - 2024. All rights reserved.