Ghost连接MariaDB容器报错,Docker Compose部署问题排查
排查Ghost + MariaDB Docker Compose连接错误的步骤
我之前也碰到过类似的容器间数据库连接问题,大概率是网络、权限或者启动顺序的锅,咱们一步步排查:
1. 先确认Docker Compose的网络配置
容器之间必须在同一个网络里才能互相访问,默认的bridge网络虽然能通,但自定义网络会更稳定。在docker-compose.yml里要确保两个服务都加入同一个网络:
version: '3.8' services: mariadb: build: ./mymariadb container_name: ghost-mariadb environment: MYSQL_ROOT_PASSWORD: your_root_pass MYSQL_DATABASE: ghost_db MYSQL_USER: ghost_user MYSQL_PASSWORD: ghost_user_pass volumes: - mariadb_data:/var/lib/mysql networks: - ghost-network healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"] interval: 5s timeout: 5s retries: 5 ghost: build: ./myghost container_name: ghost-app environment: NODE_ENV: production volumes: - ghost_content:/var/lib/ghost/content ports: - "2368:2368" depends_on: mariadb: condition: service_healthy networks: - ghost-network volumes: mariadb_data: ghost_content: networks: ghost-network: driver: bridge
这里的关键点:
- 两个服务都加入
ghost-network自定义网络 - 给mariadb加了
healthcheck,确保数据库完全就绪后再启动Ghost,避免Ghost启动时数据库还没初始化完成
2. 检查MariaDB的用户权限和初始化
你注释bind-address是对的,但还要确保创建的数据库用户允许从Ghost容器所在的网络访问——容器里的localhost指的是自身容器,不是MariaDB容器,所以不能只给localhost权限。
在mymariadb/Dockerfile里,可以用初始化脚本自动创建权限正确的用户:
FROM mariadb:10.6 # 复制自定义配置文件(bind-address已注释) COPY my.cnf /etc/mysql/my.cnf # 复制初始化脚本,创建权限正确的用户 COPY init.sql /docker-entrypoint-initdb.d/ # 设置文件权限 RUN chmod 644 /etc/mysql/my.cnf && chmod 644 /docker-entrypoint-initdb.d/init.sql
然后init.sql内容:
CREATE DATABASE IF NOT EXISTS ghost_db; CREATE USER IF NOT EXISTS 'ghost_user'@'%' IDENTIFIED BY 'ghost_user_pass'; GRANT ALL PRIVILEGES ON ghost_db.* TO 'ghost_user'@'%'; FLUSH PRIVILEGES;
'ghost_user'@'%'允许该用户从任何地址访问,刚好适配容器间的网络通信。
3. 修正Ghost的config.production.json配置
容器间通信用TCP比套接字更简单,不需要socketPath,直接用MariaDB的服务名作为host即可:
{ "url": "http://your-domain:2368", "server": { "port": 2368, "host": "0.0.0.0" }, "database": { "client": "mysql", "connection": { "host": "mariadb", // 这里是docker-compose里mariadb服务的名字 "port": 3306, "user": "ghost_user", "password": "ghost_user_pass", "database": "ghost_db" } }, "paths": { "contentPath": "/var/lib/ghost/content" }, "privacy": { "useUpdateCheck": true }, "useMinFiles": true, "mail": { "transport": "Direct" } }
注意:host必须和docker-compose里mariadb服务的名称一致,Docker会自动解析这个名称到对应容器的IP。
4. 检查Ghost的Dockerfile是否正确
确保你的myghost/Dockerfile基于官方Ghost镜像,并且正确复制配置文件、设置权限:
FROM ghost:5-alpine # 复制自定义生产配置 COPY config.production.json /var/lib/ghost/config.production.json # 设置权限,Ghost进程需要读写权限 RUN chown -R node:node /var/lib/ghost
官方Ghost镜像用node用户运行,所以要确保配置文件和内容目录的权限正确。
最后验证步骤
- 先清理旧的容器和卷:
docker-compose down -v - 重新构建并启动:
docker-compose up --build - 查看MariaDB容器日志:
docker logs ghost-mariadb,确认没有初始化错误 - 查看Ghost容器日志:
docker logs ghost-app,如果还有连接错误,日志里的具体提示(比如用户名密码错误、host无法解析)能帮你精准定位问题
内容的提问来源于stack exchange,提问作者alexyichu
相关产品推荐
相关产品推荐

