已经尝试修复这个错误几乎一整天了,现在不知道是什么可能导致这个问题。
我得到的错误是:流或文件“/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;
}
}
我试过许多解决办法,但没有一个奏效。
- 谢谢-谢谢
4条答案
按热度按时间fwzugrvs1#
您需要确保Docker容器内的用户与主机上拥有文件的用户使用相同的
uid
和gid
运行。可以使用以下命令检查容器用户权限
在您的示例中,路径为
/var/www/
然后检查主机中的用户权限
在您的示例中,路径为
./
要测试它,你可以在你的
Dockerfile
中修改uid
和gid
,使其与你在主机上的用户相同,它应该可以工作。为了能够通过你的docker-compose.yml
传递此数据,你可以像int the Documentation那样将build-args
添加到你的合成文件中。您还可以查看Laravel Sail执行此操作的方式。
ycl3bljg2#
回答你的问题确实很简单。
首先,请记住,docker默认以root身份运行,因此在创建容器期间执行的所有操作都由root用户完成。
实际情况是,您在切换到新创建的www用户后运行命令
COPY --chown=www-data:www-data . /var/www
:此用户无权更改root拥有的文件夹的所有者!另一个错误是,您要设置文件夹所有权的用户不是www-data,而是您刚刚创建的www用户。
最后,您需要切换这两个命令的顺序,并将用户从www-data更改为www,如下所示:
更改此项
变成这样
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播放按钮启动容器,可以重现该问题。
可以通过从命令行启动容器来避免此问题:
-d标志是可选的(在后台运行它)。通过命令行(而不是使用Docker Desktop客户端的播放按钮)启动后,权限问题就消失了。我发现的主要区别是,如果容器是使用Docker Desktop启动的,则在容器内部
组:用户== 1000:航行。
如果使用了命令
sail up -d
,则在容器中组:用户== sail:sail。
您可以使用这两种方法进行确认,并运行
sail root-shell
,然后在容器ls -ll
中运行一次。h4cxqtbf4#
试试看:
登录到container终端并检查目录和文件权限
此外,php-fpm必须由
www-data
用户执行。如果不是这种情况,则使用www-data.conf文件覆盖/etc/php/7.3/fpm/pool.d目录(复制或作为卷安装)