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

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服务的配置:

  1. 将FTP_USER_NAME改为root,同时设置对应的密码
  2. 调整ADDED_FLAGS添加允许root登录的参数:
ADDED_FLAGS: "--tls=2 --allow-root"

注意:此方案会让FTP服务以root权限运行,存在被恶意利用的风险,仅在测试环境或特殊场景使用。

验证步骤

  1. 停止所有容器:docker-compose down
  2. 重新启动容器:docker-compose up -d
  3. 进入WordPress容器查看权限:docker exec -it cc_wordpress ls -l /var/www/html/wp-content
  4. 通过FTP上传文件后,再次检查文件所有者是否为www-data(UID=33)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:25:22