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

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用户运行,所以要确保配置文件和内容目录的权限正确。

最后验证步骤

  1. 先清理旧的容器和卷:docker-compose down -v
  2. 重新构建并启动:docker-compose up --build
  3. 查看MariaDB容器日志:docker logs ghost-mariadb,确认没有初始化错误
  4. 查看Ghost容器日志:docker logs ghost-app,如果还有连接错误,日志里的具体提示(比如用户名密码错误、host无法解析)能帮你精准定位问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:11:59