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

Bitbucket Pipeline中Cypress测试Docker Compose应用遇404错误求助

问题原因
  1. Bitbucket Pipeline的Docker安全限制:Bitbucket出于安全考虑,默认禁止容器访问宿主机的docker.sock,这直接导致Traefik无法通过Docker API自动发现你的前后端服务,无法生成对应的路由规则。当Cypress请求http://host.docker.internal:8080/时,Traefik找不到匹配的后端服务,因此返回404;而你执行curl localhost:8080返回400,是因为Traefik收到了请求但没有匹配的路由规则,并非服务未启动。
  2. 网络与地址映射适配问题:本地环境中host.docker.internal能正确映射到宿主机,但Bitbucket Pipeline的Docker隔离环境中,这个地址的映射逻辑和本地不一致;同时Cypress使用network_mode: "service:traefik"的配置,在隔离环境中无法正确关联到后端服务的网络栈。
解决思路

1. 放弃Traefik自动服务发现,手动配置静态路由

既然Bitbucket限制访问docker.sock,就不要依赖Traefik的Docker Provider自动生成路由,直接在Traefik的静态配置文件(如traefik.yml)中手动定义路由规则,指向你的前后端服务容器:

http:
  routers:
    frontend-router:
      rule: "Host(`host.docker.internal`) && PathPrefix(`/`)"
      service: frontend-service
    backend-router:
      rule: "Host(`host.docker.internal`) && PathPrefix(`/api`)"
      service: backend-service
  services:
    frontend-service:
      loadBalancer:
        servers:
          - url: "http://web-frontend:3000/" # 替换为你的前端容器名和端口
    backend-service:
      loadBalancer:
        servers:
          - url: "http://web-backend:8000/" # 替换为你的后端容器名和端口

这样Traefik无需访问docker.sock,就能根据静态规则转发请求。

2. 让Cypress直接访问后端服务容器

在Docker Compose的默认网络中,容器可以通过名称互相访问,不需要经过Traefik:

  • 修改Cypress测试代码中的访问地址,将http://host.docker.internal:8080/替换为http://web-frontend:3000/(你的前端容器名+端口);
  • 移除Cypress服务的network_mode: "service:traefik"配置,让它加入到Docker Compose默认网络,即可直接解析容器名称。

3. 适配Bitbucket Pipeline的DinD模式(谨慎使用)

如果必须保留Traefik作为入口,可以尝试开启Docker-in-Docker(DinD)模式,让Traefik能访问内部的Docker API:
在bitbucket-pipelines.yml中添加如下配置:

pipelines:
  default:
    - step:
        name: Run E2E Tests
        services:
          - docker
        script:
          - docker compose up -d
          - docker compose --profile cypress run cypress yarn test --config video=false $@
        variables:
          DOCKER_HOST: tcp://docker:2375

注意:该方式可能触发Bitbucket的安全策略限制,需要确认项目权限是否允许。

4. 增加Pipeline调试步骤验证连通性

在执行Cypress测试前,添加调试命令确认服务状态:

# 验证Traefik能否访问前端服务
docker compose exec traefik curl http://web-frontend:3000
# 验证Cypress容器能否直接访问前端服务
docker compose exec cypress curl http://web-frontend:3000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:27:11