Docker Compose部署Directus连接MySQL容器出现ECONNREFUSED错误的排查求助
Docker Compose部署Directus连接MySQL容器出现ECONNREFUSED错误的排查求助
大家好,我最近在用Docker Compose部署Directus的时候遇到了一个棘手的问题——Directus容器始终无法连接到MySQL容器,一直报连接被拒绝的错误,折腾了好几种配置都没解决,想请大家帮忙看看问题出在哪🥺
我的配置文件
docker-compose.yml
version: "3" services: cx_cache: container_name: ${APP_NAME}_cache image: redis:7.2.2-alpine networks: - ${APP_NAME}_directus cx_mysql: container_name: ${APP_NAME}_mysql image: mysql:8.2 command: mysqld --default-authentication-plugin=mysql_native_password restart: always expose: - 3306 ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_ROOT_HOST: ${MYSQL_ROOT_HOST} MYSQL_HOST: ${MYSQL_HOST} MYSQL_DATABASE: ${APP_NAME} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} MYSQL_TCP_PORT: 3306 directus: container_name: ${APP_NAME}_directus build: dockerfile: "Dockerfile" ports: - 8055:8055 volumes: - ./uploads:/directus/uploads - ./extensions:/directus/extensions networks: - ${APP_NAME}_directus depends_on: - ${APP_NAME}_cache - ${APP_NAME}_mysql environment: HOST: 0.0.0.0 PORT: 8055 KEY: "${APP_KEY}" SECRET: "${APP_SECRET}" DB_CLIENT: "mysql" DB_HOST: "localhost" DB_PORT: "3306" DB_DATABASE: "${APP_NAME}" DB_USER: "${MYSQL_USER}" DB_PASSWORD: "${MYSQL_PASSWORD}" DB_EXCLUDE_TABLES: "spatial_ref_sys,sysdiagrams" CACHE_ENABLED: "true" CACHE_STORE: "redis" CACHE_REDIS: "redis://${APP_NAME}_cache:6379" ADMIN_EMAIL: "mondo+${APP_NAME}@$(APP_EMAIL_DOMAIN)" ADMIN_PASSWORD: "${APP_ADMIN_PASSWORD}" ROBOTS_TXT: "User-agent: *\nDisallow: /" LOG_LEVEL: "debug" LOG_STYLE: "pretty" TELEMETRY: "false" QUERY_LIMIT_MAX: -1 networks: cx_directus:
.env文件
APP_NAME=cx APP_KEY=XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX APP_SECRET=XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX APP_ADMIN_PASSWORD=XXXX APP_EMAIL_DOMAIN=myDomain.com MYSQL_ROOT_PASSWORD=XXXXXXXXXX MYSQL_ROOT_HOST=127.0.0.1 MYSQL_HOST=* MYSQL_DATABASE=cx MYSQL_USER=directus MYSQL_PASSWORD=XXXXXXX
问题现象
当我运行docker-compose up后,Redis和MySQL容器都能正常启动,但Directus容器启动失败,一直报以下错误:
cx_directus | node:internal/process/promises:288 cx_directus | triggerUncaughtException(err, true /* fromPromise */); cx_directus | ^ cx_directus | cx_directus | Error: connect ECONNREFUSED 127.0.0.1:3306 cx_directus | at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1555:16) cx_directus | -------------------- cx_directus | at Protocol._enqueue (/directus/node_modules/.pnpm/mysql@2.18.1/node_modules/mysql/lib/protocol/Protocol.js:144:48) cx_directus | at Protocol.handshake (/directus/node_modules/.pnpm/mysql@2.18.1/node_modules/mysql/lib/protocol/Protocol.js:51:23) cx_directus | at Connection.connect (/directus/node_modules/.pnpm/mysql@2.18.1/node_modules/mysql/lib/Connection.js:116:18) cx_directus | at /directus/node_modules/.pnpm/knex@2.4.2_mysql@2.18.1_pg@8.11.0_sqlite3@5.1.6_tedious@16.1.0/node_modules/knex/lib/dialects/mysql/index.js:66:18 cx_directus | at new Promise (<anonymous>) cx_directus | at Client_MySQL.acquireRawConnection (/directus/node_modules/.pnpm/knex@2.4.2_mysql@2.18.1_pg@8.11.0_sqlite3@5.1.6_tedious@16.1.0/node_modules/knex/lib/dialects/mysql/index.js:61:12) cx_directus | at create (/directus/node_modules/.pnpm/knex@2.4.2_mysql@2.18.1_pg@8.11.0_sqlite3@5.1.6_tedious@16.1.0/node_modules/knex/lib/client.js:254:39) { cx_directus | errno: -111, cx_directus | code: 'ECONNREFUSED', cx_directus | syscall: 'connect', cx_directus | address: '127.0.0.1', cx_directus | port: 3306, cx_directus | fatal: true cx_directus | } cx_directus | cx_directus | Node.js v18.18.2 cx_directus exited with code 1
已经做的排查
- 尝试过修改
MYSQL_HOST和MYSQL_ROOT_HOST的值,包括*、%、localhost、0.0.0.0、127.0.0.1,但都没有解决问题 - 已经验证MySQL容器是正常运行的,通过以下命令进入容器后,能成功用directus用户登录MySQL:
docker exec -it cx_mysql bash
bash-4.4# mysql -u directus -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.2.0 MySQL Community Server - GPL
...(省略后续登录成功的输出)
现在我实在找不到问题所在了,感觉肯定是某个细节没注意到,有没有大佬能指点一下下一步该怎么排查?太头疼了😩
备注:内容来源于stack exchange,提问作者mondo
相关产品推荐
相关产品推荐

