Docker环境下PHP文件操作权限拒绝及fwrite类型错误求助
Docker LAMP环境下PHP文件写入权限问题
问题背景
本地PHP安装存在问题,通过Docker搭建LAMP环境,跟随《PHP Crash Course》(Brad Traversy,YouTube)第14部分文件处理章节学习时,遇到文件写入权限错误。
错误信息
Warning: fopen(users.txt): Failed to open stream: Permission denied in /var/www/html/filehandling.php on line 13
Fatal error: Uncaught TypeError: fwrite(): Argument #1 ($stream) must be of type resource, bool given in /var/www/html/filehandling.php:15 Stack trace: #0 /var/www/html/filehandling.php(15): fwrite(false, 'Brad') #1 {main} thrown in /var/www/html/filehandling.php on line 15
已排查信息与尝试操作
- 容器内执行
whoami返回root,本地终端执行返回普通用户名 - 容器内目录权限列表(
ls -altrh):
# ls -altrh total 68K drwxr-xr-x 1 root root 4.0K Sep 13 09:45 .. -rwxr-xr-x 1 1000 1000 14 Oct 14 14:57 phpinfo.php drwxr-xr-x 2 1000 1000 4.0K Oct 14 18:51 db -rwxr-xr-x 1 1000 1000 0 Oct 15 17:18 .env -rwxr-xr-x 1 1000 1000 90 Oct 15 17:23 .env.example -rwxr-xr-x 1 1000 1000 5 Oct 15 17:25 .gitignore -rwxr-xr-x 1 1000 1000 3.7K Nov 9 17:15 variables.php -rwxr-xr-x 1 1000 1000 468 Nov 9 17:32 getpost.php -rwxr-xr-x 1 1000 1000 599 Nov 14 15:15 sanitizinginput.php -rwxr-xr-x 1 1000 1000 167 Nov 14 15:38 cookies.php -rwxr-xr-x 1 1000 1000 904 Nov 14 16:03 sessions.php -rwxr-xr-x 1 1000 1000 225 Nov 19 17:10 package.json drwxr-xr-x 4 1000 1000 4.0K Nov 20 15:26 . -rwxr-xr-x 1 1000 1000 734 Nov 20 15:26 docker-compose.yml -rwxr-xr-x 1 1000 1000 335 Nov 20 15:26 index.php drwxr-xr-x 2 1000 1000 4.0K Nov 20 16:29 extras -rwxr-xr-x 1 1000 1000 283 Nov 20 18:07 filehandling.php -rwxr-xr-x 1 1000 1000 73 Nov 20 18:12 Dockerfile #
- 容器内Apache运行用户(
ps aux | egrep '(apache|httpd)'):
# ps aux | egrep '(apache|httpd)' root 1 0.3 0.1 219560 28892 ? Ss 09:28 0:00 apache2 -DFOREGROUND www-data 23 0.0 0.0 219592 7804 ? S 09:28 0:00 apache2 -DFOREGROUND www-data 24 0.0 0.0 219592 7804 ? S 09:28 0:00 apache2 -DFOREGROUND www-data 25 0.0 0.0 219592 7804 ? S 09:28 0:00 apache2 -DFOREGROUND www-data 26 0.0 0.0 219592 7804 ? S 09:28 0:00 apache2 -DFOREGROUND www-data 27 0.0 0.0 219592 7804 ? S 09:28 0:00 apache2 -DFOREGROUND root 35 0.0 0.0 3180 652 pts/0 S+ 09:29 0:00 grep -E (apache|httpd)
- Dockerfile中尝试过的权限修改命令(不同时执行):
RUN chown -R www-data /var/www/html/ RUN chown -R www-data:www-data /var/www/html/ RUN chown 777 /var/www/html RUN chown 777 www-data /var/www/html
解决方案
修正权限命令混淆问题:
chown用于修改文件所有者,chmod才是修改权限。之前的RUN chown 777 /var/www/html是错误用法,正确权限修改应该用chmod。另外,由于本地目录挂载到容器,镜像构建阶段的RUN命令无法修改挂载后目录的权限,需在容器启动后操作。对齐容器与本地目录用户ID:
- 容器内执行
id www-data,获取其UID和GID(通常为33:33) - 本地终端对项目目录执行
chown -R 33:33 ./<你的项目目录>,让本地目录所有者与容器内www-data一致
- 容器内执行
让Apache以www-data用户运行:在
docker-compose.yml的Apache服务中添加user: www-data配置,确保服务进程以有权限的用户执行:
services: apache: # 其他配置 user: www-data
临时测试验证(不推荐生产环境):进入容器执行
chmod -R 777 /var/www/html,若问题解决则确认是权限问题,后续再调整为更安全的权限(如chmod -R 755 /var/www/html并确保所有者为www-data)检查PHP代码路径:确保
fopen使用绝对路径,比如fopen('/var/www/html/users.txt', 'w'),避免相对路径导致的路径解析错误
内容的提问来源于stack exchange,提问作者DDt
相关产品推荐
相关产品推荐

