现在几乎一整天都在尝试修复这个错误,不知道是什么导致了这个问题。
我得到的错误是: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;
}
}
我尝试了很多解决方案,但没有一个有效。
谢谢。
您需要确保 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 的做法。
我在 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
.
你的问题的答案确实很简单。
首先,请记住 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
对我有用的是以下
我在容器内登录并删除了现有的 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
试试这个:
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