Docker Mailserver启动报错:已创建账户仍提示需邮箱账户启动Dovecot
问题场景
用户配置的docker-compose.yml如下:
version: '3.8' services: mailserver: image: docker.io/mailserver/docker-mailserver:latest container_name: mailserver hostname: mail-server domainname: domain.de ports: - "25:25" - "587:587" - "465:465" volumes: - ./docker-data/dms/mail-data/:/var/mail/ - ./docker-data/dms/mail-state/:/var/mail-state/ - ./docker-data/dms/mail-logs/:/var/log/mail/ - ./docker-data/dms/config/:/tmp/docker-mailserver/ - ./docker-data/nginx-proxy/certs/:/usr/local/psa/var/modules/letsencrypt/ - /etc/localtime:/etc/localtime:ro environment: - ENABLE_FAIL2BAN=1 - SSL_TYPE=letsencrypt - PERMIT_DOCKER=network - ONE_DIR=1 - ENABLE_POSTGREY=0 - ENABLE_CLAMAV=0 - ENABLE_SPAMASSASSIN=0 - SPOOF_PROTECTION=0 cap_add: - NET_ADMIN # For Fail2Ban to work - SYS_PTRACE
执行docker-compose up时触发报错:
Error while running Docker Mailserver via docker-compose up: You need at least one mail account to start Dovecot
已通过./setup.sh email add user@domain password创建账户,且./setup.sh email list能查到该账户,但报错依旧。
排查与解决步骤
1. 确认账户文件路径匹配
Docker Mailserver的账户信息默认存储在postfix-accounts.cf文件中,检查本地挂载的配置目录是否存在该文件:
cat ./docker-data/dms/config/postfix-accounts.cf
如果文件为空或不存在,说明setup.sh未正确写入到挂载目录。需指定容器名重新执行创建命令:
./setup.sh -c mailserver email add user@domain.de password
2. 适配ONE_DIR环境变量的路径
你设置了ONE_DIR=1,该配置会将所有数据集中到/var/mail-state/目录,此时容器实际读取账户文件的路径为/var/mail-state/lib/postfix/postfix-accounts.cf:
- 检查本地对应路径
./docker-data/dms/mail-state/lib/postfix/postfix-accounts.cf是否存在有效内容 - 若不存在,手动将
./docker-data/dms/config/postfix-accounts.cf复制到该目录,或重新运行setup.sh确保写入正确路径
3. 修复目录权限
Docker Mailserver以UID/GID 5000的用户运行,权限错误会导致容器无法读取账户文件:
sudo chown -R 5000:5000 ./docker-data/dms/
4. 清理旧容器重新启动
旧容器的缓存或状态可能引发异常,先清理再重新启动:
docker-compose down docker-compose up -d
启动后查看日志确认问题是否解决:
docker logs -f mailserver
5. 确保账户域名与配置一致
检查创建的账户域名user@domain是否和docker-compose.yml中domainname: domain.de匹配,Dovecot要求账户域名必须是服务器配置的域名之一,修改账户域名重试:
./setup.sh -c mailserver email add user@domain.de newpassword ./setup.sh -c mailserver email delete user@domain
内容的提问来源于stack exchange,提问作者tritomit

