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

如何在GitHub Actions中让CI容器访问其他Docker容器

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 07:52:59