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

GitLab CI的docker:dind如何配置卷挂载解决Selenium下载测试失败问题

错误根因

你遇到的问题是两个配置错误共同导致的:

  1. RemoteWebDriver下载路径配置错误:你使用的是远程Chrome浏览器(跑在独立的docker容器中),download.default_directory配置的是浏览器所在容器的内部路径,而不是Java测试代码运行的CI Job容器的路径,你之前配置的/target在Chrome容器中不存在、且无写入权限,实际应该配置Chrome容器内的默认下载路径/home/seluser/Downloads。
  2. dind模式下卷挂载路径不互通:GitLab CI中docker:dind是独立的服务容器,你在CI Job容器中创建的/target是Job容器的本地路径,docker-compose启动的Chrome容器的卷挂载默认读取的是dind容器的文件系统,两边路径不互通导致文件无法同步。

具体修改步骤

1. 修改Java测试代码的Chrome下载路径配置

@BeforeMethod
public void setUp() throws  MalformedURLException {
    // 检查文件的路径改为CI Job容器内的项目target目录
    String directory = "./target";
    folder = new File(directory);

    System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
    ChromeOptions options = new ChromeOptions();

    Map<String, Object> prefs = new HashMap<String, Object>();
    prefs.put("profile.default_content_settings.popups", 0);
    prefs.put("download.prompt_for_download", "false");
    prefs.put("download.directory_upgrade", "true");
    // 下载路径改为Chrome容器内部的可写下载目录
    prefs.put("download.default_directory", "/home/seluser/Downloads");

    // 其余代码保持不变
}

2. 修改docker-compose.yml的卷挂载配置

将绝对路径挂载改为相对当前CI工作目录的路径挂载,GitLab Runner会自动将Job的工作目录$CI_PROJECT_DIR同步挂载到dind容器的同路径下,保证两边目录互通:

version: "3"
services:
  chrome:
    image: selenium/node-chrome:4.0.0-20211013
    container_name: chrome
    shm_size: 2gb
    depends_on:
      - selenium-hub
    # 仅修改volumes字段,其余保持不变
    volumes:
      - ./target:/home/seluser/Downloads
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - SE_NODE_GRID_URL=http://localhost:4444
    ports:
      - "6900:5900"
  # 其余服务配置保持不变

3. 修改gitlab-ci.yml中chrome-test阶段的目录创建逻辑

将根目录的target改为当前工作目录下的target,并给足权限保证Chrome容器的seluser用户可以写入:

chrome-test:
  # 其余配置保持不变,仅修改script段的目录创建命令
  script:
    - apk add --no-cache docker-compose
    - apk add openjdk11
    # 把原来的mkdir /target替换为下面两行
    - mkdir -p ./target
    - chmod -R 777 ./target
    - docker-compose down
    - docker-compose up --build --force-recreate --no-deps -d
    - echo "Hello, chrome-test"
    - chmod +x ./gradlew
    - ./gradlew :test --tests "LoginTest_chrome_ci"

验证逻辑

修改后文件同步流程为:

  • Chrome容器的下载目录/home/seluser/Downloads挂载到了dind容器的$CI_PROJECT_DIR/target
  • dind容器的$CI_PROJECT_DIR/target和CI Job容器的./target是Runner同步挂载的同一份目录
  • Java测试代码检查Job容器内的./target就能读到Chrome下载的文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:24:03