Docker Compose部署WordPress+Pure-ftpd:FTP用户无写入权限
FTP创建文件无写入权限问题解决及Docker Compose配置优化
背景
- Win10系统的WSL2环境中部署了WordPress + MariaDB + PhpMyAdmin + Pure-ftpd容器集群
- 为避免性能损耗,未将项目文件与本地系统绑定,采用pure-ftpd工具更新容器卷内容
- 当前集群运行稳定,数据库容量1GB+,站点文件500MB,用户上传文件累计22GB
问题
- 通过FTP创建的文件无写入权限,无法生成新脚本,临时解决方案是进入卷将文件权限改为777
- pure-ftpd使用UID为1000的用户创建文件,但该用户在容器内不存在
- 需调整Docker Compose配置,解决权限不匹配问题,或实现pure-ftpd以合适身份写入wordpress卷
当前Docker Compose配置
services: #DATABASE db: container_name: cc_db # 支持amd64和arm64架构的mariadb镜像 image: mariadb:10.6.9-focal command: '--default-authentication-plugin=mysql_native_password' volumes: - cc_db:/var/lib/mysql/****_woo - ./my_customized.cnf:/etc/mysql/my.cnf ports: - "3306:3306" # 允许远程连接 restart: always environment: - MYSQL_ROOT_PASSWORD=******++ - MYSQL_DATABASE=****** - MYSQL_USER=wordpress - MYSQL_PASSWORD=wordpress expose: - 3306 - 33060 networks: - cc_network #PHPMYADMIN phpmyadmin: image: phpmyadmin/phpmyadmin depends_on: - db environment: - UPLOAD_LIMIT=768M - PMA_HOST:db - PMA_PORT:3306 - PMA_ARBITRARY:1 - MYSQL_ROOT_PASSWORD=******++ restart: always ports: - 8080:80 networks: - cc_network #WORDPRESS wordpress: container_name: cc_wordpress # 当前站点配置:WordPress 6.0.2 + PHP 8.1.10 + MariaDB 10.6.9,上传限制128MB,PHP执行时限120秒,最大输入变量4500 image: wordpress:6.0.2-php8.1 ports: - 80:80 restart: always networks: - cc_network environment: # 本地开发环境调试模式 - WORDPRESS_DEBUG:1 - WORDPRESS_DB_HOST=db:3306 - WORDPRESS_DB_USER=wordpress - WORDPRESS_DB_PASSWORD=wordpress - WORDPRESS_DB_NAME=***** volumes: - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini - ./httpd/wp-config.php:/var/www/html/wp-config.php - ./httpd/.htaccess:/var/www/html/.htaccess - cc_wordpress:/var/www/html/wp-content:rw ftp: container_name: ftpd-server image: stilliard/pure-ftpd:hardened depends_on: - wordpress ports: - 21:21 - 20:20 - 30000-30009:30000-30009 volumes: - cc_wordpress:/home/user/:rw - './ftp/pass:/etc/pure-ftpd/passwd' environment: PUBLICHOST: "10.47.61.236" FTP_USER_NAME: "user" FTP_USER_PASS: "*****++" FTP_USER_HOME: "/home/user" ADDED_FLAGS: "--tls=2" TLS_CN: "**** FTP" TLS_ORG: "*****" TLS_C: "US" MAX_CONNECTIONS: "20" restart: always networks: - cc_network networks: cc_network: volumes: cc_wordpress: cc_db:
解决方案
核心原因
WordPress容器中/var/www/html/wp-content目录的所有者是www-data用户(UID=33),而pure-ftpd默认用UID=1000创建文件,两个容器的UID不匹配导致权限拒绝。
方案一:统一UID/GID(推荐)
修改ftp服务的环境变量,让pure-ftpd使用和WordPress一致的UID和GID:
在ftp服务的environment块中添加:
FTP_USER_UID: 33 FTP_USER_GID: 33
修改后的ftp服务环境变量部分:
environment: PUBLICHOST: "10.47.61.236" FTP_USER_NAME: "user" FTP_USER_PASS: "*****++" FTP_USER_HOME: "/home/user" FTP_USER_UID: 33 FTP_USER_GID: 33 ADDED_FLAGS: "--tls=2" TLS_CN: "**** FTP" TLS_ORG: "*****" TLS_C: "US" MAX_CONNECTIONS: "20"
这样pure-ftpd创建的文件会直接属于UID=33的用户,和WordPress的运行用户权限匹配,无需修改全局权限。
方案二:以root身份运行pure-ftpd(不推荐,存在安全风险)
如果必须用root身份写入,可修改ftp服务的配置:
- 将
FTP_USER_NAME改为root,同时设置对应的密码 - 调整
ADDED_FLAGS添加允许root登录的参数:
ADDED_FLAGS: "--tls=2 --allow-root"
注意:此方案会让FTP服务以root权限运行,存在被恶意利用的风险,仅在测试环境或特殊场景使用。
验证步骤
- 停止所有容器:
docker-compose down - 重新启动容器:
docker-compose up -d - 进入WordPress容器查看权限:
docker exec -it cc_wordpress ls -l /var/www/html/wp-content - 通过FTP上传文件后,再次检查文件所有者是否为
www-data(UID=33)
内容的提问来源于stack exchange,提问作者Jpv
相关产品推荐
相关产品推荐

