使用ACT的GitHub Actions:Docker容器内访问MySQL服务
GitHub Actions中容器化步骤访问Services服务(MySQL示例)
当你给GitHub Actions的Job配置了container字段后,所有步骤都会在这个容器内运行,而services中定义的MySQL服务是一个独立容器,两者默认处于GitHub Actions自动创建的专属网络中,但不能通过127.0.0.1访问——因为本地回环地址只指向当前步骤所在的容器。
解决方案:使用服务名称作为主机地址
GitHub Actions会自动为每个services条目创建DNS解析,直接用服务的名称(这里是mysql)作为主机名就能访问对应的服务,不需要把端口映射到主机。
1. 修改MySQL连接命令
把原来的mysql -h127.0.0.1改成:
mysql -hmysql -uroot -psecret
2. 优化Services配置(可选)
既然容器间网络不需要端口暴露到主机,可以移除services里的ports字段,减少不必要的配置:
services: mysql: image: mysql:5.7 env: MYSQL_ROOT_PASSWORD: secret options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
修改后的完整Workflow示例
name: Docker on: push: branches: [ "master" ] pull_request: branches: [ "master" ] jobs: namea: name: Docker Test runs-on: ubuntu-latest services: mysql: image: mysql:5.7 env: MYSQL_ROOT_PASSWORD: secret options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 container: image: public-docker-image options: --user root ports: - 80:80 steps: - uses: actions/checkout@v3 - name: Setup run: | # 可选:先验证DNS解析和连通性 ping -c 3 mysql # 连接MySQL并执行测试命令 mysql -hmysql -uroot -psecret -e "SELECT VERSION();"
原理说明
GitHub Actions会为每个Job创建一个专属的Docker网络,Job的主容器(即container字段定义的容器)和所有services容器都会自动加入这个网络。在这个网络内,容器之间可以通过服务名称直接访问对方的默认端口(MySQL默认是3306),无需额外端口映射。
内容的提问来源于stack exchange,提问作者alobeejay
相关产品推荐
相关产品推荐

