You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 

解决方案

  1. 修正权限命令混淆问题:chown用于修改文件所有者,chmod才是修改权限。之前的RUN chown 777 /var/www/html是错误用法,正确权限修改应该用chmod。另外,由于本地目录挂载到容器,镜像构建阶段的RUN命令无法修改挂载后目录的权限,需在容器启动后操作。

  2. 对齐容器与本地目录用户ID:

    • 容器内执行id www-data,获取其UID和GID(通常为33:33)
    • 本地终端对项目目录执行chown -R 33:33 ./<你的项目目录>,让本地目录所有者与容器内www-data一致
  3. 让Apache以www-data用户运行:在docker-compose.yml的Apache服务中添加user: www-data配置,确保服务进程以有权限的用户执行:

services:
  apache:
    # 其他配置
    user: www-data
  1. 临时测试验证(不推荐生产环境):进入容器执行chmod -R 777 /var/www/html,若问题解决则确认是权限问题,后续再调整为更安全的权限(如chmod -R 755 /var/www/html并确保所有者为www-data)

  2. 检查PHP代码路径:确保fopen使用绝对路径,比如fopen('/var/www/html/users.txt', 'w'),避免相对路径导致的路径解析错误

内容的提问来源于stack exchange,提问作者DDt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:20:24