如何在GitHub Actions中让CI容器访问其他Docker容器
嘿,我来帮你搞定这个问题!从你给出的配置来看,你现在在GitHub Actions里用docker-compose启动了MongoDB容器,现在想让你的CI工具容器能访问这个数据库容器对吧?这其实是个容器网络通信的常见问题,我给你一步步说怎么解决:
首先得明白一个关键点:在GitHub Actions的runner主机上,你启动的MongoDB容器和后来的CI容器,默认是不在同一个Docker网络里的,而且容器里的localhost和主机的localhost不是一回事——CI容器里的localhost指向的是它自己,不是运行GitHub Actions的主机,所以直接用localhost:27017肯定连不上MongoDB。
下面是具体的解决办法:
1. 给Docker容器配置自定义网络
先修改你的./docker/docker-compose.test.yml,添加一个自定义的Docker网络,让MongoDB和CI容器都加入这个网络,这样它们就能通过服务名直接通信了:
services: database: image: mongo:5.0.4 # volumes: # - ./db:/data/db ports: - '27017:27017' environment: - MONGO_INITDB_ROOT_USERNAME=<hidden> - MONGO_INITDB_ROOT_PASSWORD=<hidden> - MONGO_INITDB_DATABASE=<hidden> networks: - ci-network networks: ci-network: name: ci-shared-network driver: bridge
这里我们定义了一个名为ci-shared-network的桥接网络,并且让MongoDB服务加入这个网络。
2. 启动CI容器时加入同一个网络
当你启动CI工具容器的时候,一定要指定它加入刚才创建的ci-shared-network网络,比如你的启动命令原来是:
docker run --name ci-tool -d my-ci-image:latest
现在要改成:
docker run --name ci-tool --network ci-shared-network -d my-ci-image:latest
3. 修改测试代码的数据库连接地址
这一步很关键!在你的测试代码里,数据库的连接串不能再用localhost:27017了,要换成database:27017——这里的database就是你在docker-compose里给MongoDB服务起的名字,Docker的内置DNS会自动把这个名字解析成MongoDB容器的IP地址。
比如连接串要改成:
mongodb://<username>:<password>@database:27017/<dbname>
4. 调整GitHub Actions的Workflow步骤
结合你现有的Workflow,把原来的Test步骤拆分成启动MongoDB和启动CI容器跑测试两部分,示例如下:
jobs: check: runs-on: ubuntu-latest steps: <setup steps omitted for brevity> - name: Start MongoDB Service run: docker compose --file ./docker/docker-compose.test.yml up -d - name: Run Tests in CI Container run: | # 启动CI容器并挂载代码目录,同时指定网络 docker run --network ci-shared-network \ -v ${{ github.workspace }}:/workspace \ -w /workspace \ my-ci-image:latest \ npm run test
这里用-v把GitHub Actions的工作目录挂载到CI容器里,-w设置容器的工作目录为挂载的目录,这样容器里的npm就能找到你的测试代码和package.json了。
另外还有个备选方案:如果你觉得自定义网络太麻烦,也可以在启动CI容器时用--network host参数,让CI容器直接使用主机的网络栈,这样就能用localhost:27017访问MongoDB了。不过这种方式不够灵活,而且在一些环境下有安全风险,还是更推荐用自定义网络的方式。
备注:内容来源于stack exchange,提问作者goastler

