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

Gitlab CI DinD环境下子容器无法连接父容器服务的求助

解决GitLab CI中Cypress容器无法访问Runner服务的问题

核心问题分析

你遇到的问题根源有两个:

  1. 网络隔离:GitLab CI的Runner容器与DIND(Docker-in-Docker)中启动的Cypress容器处于不同网络命名空间,Cypress容器内的localhost指向自身,而非Runner容器的localhost。
  2. 环境变量错误:Cypress识别的baseUrl环境变量是CYPRESS_BASE_URL(大写+下划线格式),你之前的cypress_baseUrl=写法无法被Cypress读取。

具体解决方案

方案1:使用Host网络(最简方案)

让Cypress容器共享Runner容器的网络命名空间,这样容器内的localhost直接指向Runner的localhost,无需修改IP:

修改.gitlab-ci.yml中script段的最后一行:

docker run --network=host -e CYPRESS_BASE_URL=http://localhost:3000 my.company.io/project-sample/app-cypress:latest yarn cypress:ci

方案2:使用自定义网络+Runner IP(更规范)

如果不想使用Host网络,可通过自定义网络+Runner容器IP实现访问:

  1. 在DIND中创建自定义网络
  2. 获取Runner容器的IP(DIND视角下,Runner是它的宿主机,IP可通过hostname -i获取)
  3. 配置Cypress的baseUrl为该IP

修改script段:

# 创建自定义网络
docker network create e2e-test-net
# 启动Cypress容器并加入网络,指定正确的baseUrl
docker run --network=e2e-test-net -e CYPRESS_BASE_URL=http://$(hostname -i):3000 my.company.io/project-sample/app-cypress:latest yarn cypress:ci

也可直接使用DIND默认网关IP(通常为172.17.0.1):

docker run --network=bridge -e CYPRESS_BASE_URL=http://172.17.0.1:3000 my.company.io/project-sample/app-cypress:latest yarn cypress:ci

额外验证项

  • 确认你的服务通过sbt run启动时,监听地址是0.0.0.0:3000而非仅127.0.0.1,否则即使网络打通,外部容器也无法访问。可检查服务配置文件,确保绑定地址为0.0.0.0。

内容的提问来源于stack exchange,提问作者Tanyagorn Benjaprompadung

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:15:46