Circle CI:无法通过Docker实例连接MySQL的问题求助
无法连接CircleCI中MySQL容器的问题排查与解决
问题描述
我尝试在CircleCI中部署MySQL Docker镜像、创建数据库并测试运行迁移(migrations)和种子文件(seeders),但系统提示无法访问运行在127.0.0.1:3306的MySQL服务器,是否有遗漏的配置?
报错信息
#!/bin/bash -eo pipefail mysql -h 127.0.0.1 -u root -psecret dbname < output/migrate.sql mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1:3306' (111) Exited with code exit status 1 CircleCI received exit code 1
我的CircleCI配置
version: 2.1 jobs: migrate-seed: docker: - image: cimg/base:2022.10 - image: cimg/mysql:8.0 environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: dbname steps: - checkout - run: sudo chmod +x scripts/dump-all - run: mkdir output - run: scripts/dump-all - run: sudo apt-get update - run: sudo apt-get install -y mysql-client - run: name: Run Migrations command: mysql -h 127.0.0.1 -u root -psecret dbname < output/migrate.sql - run: name: Run Seeders command: mysql -h 127.0.0.1 -u root -psecret dbname < output/seed.sql workflows: database: jobs: - migrate-seed
解决方案
1. 修正容器间的连接地址
CircleCI中,同job下的多个Docker容器是通过容器别名进行网络通信的,而非127.0.0.1(127.0.0.1指向的是执行命令的base容器自身)。
将连接命令中的-h 127.0.0.1替换为-h mysql(第二个容器的默认别名是镜像名称mysql,也可以在配置中给MySQL容器指定name字段自定义别名)。
2. 添加MySQL启动等待逻辑
MySQL容器启动需要一定时间初始化,直接运行迁移会因服务未就绪导致连接失败。需要在安装mysql-client后,添加等待脚本确保MySQL服务可用:
until mysql -h mysql -u root -psecret -e "SELECT 1"; do echo "等待MySQL启动..." sleep 2 done
3. 调整后的完整CircleCI配置
version: 2.1 jobs: migrate-seed: docker: - image: cimg/base:2022.10 - image: cimg/mysql:8.0 environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: dbname steps: - checkout - run: sudo chmod +x scripts/dump-all - run: mkdir output - run: scripts/dump-all - run: sudo apt-get update - run: sudo apt-get install -y mysql-client - run: name: 等待MySQL服务启动 command: | until mysql -h mysql -u root -psecret -e "SELECT 1"; do echo "等待MySQL启动..." sleep 2 done - run: name: Run Migrations command: mysql -h mysql -u root -psecret dbname < output/migrate.sql - run: name: Run Seeders command: mysql -h mysql -u root -psecret dbname < output/seed.sql workflows: database: jobs: - migrate-seed
内容的提问来源于stack exchange,提问作者user5405648
相关产品推荐
相关产品推荐

