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

ohtdti5x  于 2022-11-18  发布在  Docker
关注(0)|答案(4)|浏览(186)

已经尝试修复这个错误几乎一整天了,现在不知道是什么可能导致这个问题。
我得到的错误是:流或文件“/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

停靠文件:

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;
    }
}

我试过许多解决办法,但没有一个奏效。

  • 谢谢-谢谢
fwzugrvs

fwzugrvs1#

您需要确保Docker容器内的用户与主机上拥有文件的用户使用相同的uidgid运行。
可以使用以下命令检查容器用户权限

docker-compose exec <service-name> ls -la /path/to/app/directory

在您的示例中,路径为/var/www/
然后检查主机中的用户权限

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

在您的示例中,路径为./
要测试它,你可以在你的Dockerfile中修改uidgid,使其与你在主机上的用户相同,它应该可以工作。为了能够通过你的docker-compose.yml传递此数据,你可以像int the Documentation那样将build-args添加到你的合成文件中。
您还可以查看Laravel Sail执行此操作的方式。

ycl3bljg

ycl3bljg2#

回答你的问题确实很简单。
首先,请记住,docker默认以root身份运行,因此在创建容器期间执行的所有操作都由root用户完成。
实际情况是,您在切换到新创建的www用户后运行命令COPY --chown=www-data:www-data . /var/www:此用户无权更改root拥有的文件夹的所有者!
另一个错误是,您要设置文件夹所有权的用户不是www-data,而是您刚刚创建的www用户。
最后,您需要切换这两个命令的顺序,并将用户从www-data更改为www,如下所示:
更改此项

USER www

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

变成这样

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

USER www
lc8prwob

lc8prwob3#

我在Windows 10上使用带有Laravel的Docker Desktop时遇到了这个问题。我遇到了文件权限问题。即:file_put_contents(...): failed to open stream: No such file or directory .
编辑权限将允许我使用Artisan命令创建文件,但会阻止我使用Visual Studio代码在本地实际编辑文件(反之亦然)。
很多搜索都没有得到有用的结果,直到我找到了关于这个问题的帖子:https://github.com/laravel/sail/issues/81#issuecomment-1304499939
通过使用Docker桌面中的GUI播放按钮启动容器,可以重现该问题。
可以通过从命令行启动容器来避免此问题:

sail up -d

-d标志是可选的(在后台运行它)。通过命令行(而不是使用Docker Desktop客户端的播放按钮)启动后,权限问题就消失了。我发现的主要区别是,如果容器是使用Docker Desktop启动的,则在容器内部
组:用户== 1000:航行。
如果使用了命令sail up -d,则在容器中
组:用户== sail:sail。
您可以使用这两种方法进行确认,并运行sail root-shell,然后在容器ls -ll中运行一次。

h4cxqtbf

h4cxqtbf4#

试试看:

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

登录到container终端并检查目录和文件权限

>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

相关问题