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

在Bitbucket Pipelines中使用Webdriver Testcontainer遇权限问题求助

解决Bitbucket Pipelines中Testcontainers WebDriver容器的403挂载权限错误

问题根源

Bitbucket Pipelines的Docker权限插件严格限制了容器能挂载的路径,仅允许挂载$BITBUCKET_CLONE_DIR及其子目录。而Testcontainers的BrowserWebDriverContainer默认会给Selenium容器添加/dev/shm的绑定挂载,这个路径不在允许列表内,直接触发了403错误。你添加的--disable-dev-shm-usage是Chrome的启动参数,只控制Chrome是否使用/dev/shm,无法改变Testcontainers对容器的挂载配置。

解决方法

方法1:自定义容器挂载配置,替换/dev/shm路径

修改测试代码,通过withCreateContainerCmdModifier移除默认的/dev/shm挂载,同时将其替换为$BITBUCKET_CLONE_DIR下的临时目录(符合Bitbucket的挂载规则):

package com.byzpass.demo;

import org.junit.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testcontainers.containers.BrowserWebDriverContainer;
import org.testcontainers.shaded.com.github.dockerjava.api.command.CreateContainerCmd;
import org.testcontainers.shaded.com.github.dockerjava.api.model.Bind;
import org.testcontainers.shaded.com.github.dockerjava.api.model.Volume;

import java.io.File;

public class SeleniumTest {
    public ChromeOptions chromeOptions = new ChromeOptions()
            .addArguments("--no-sandbox")
            .addArguments("--headless")
            .addArguments("--disable-dev-shm-usage");

    @Rule
    public BrowserWebDriverContainer<?> driverContainer = new BrowserWebDriverContainer<>()
            .withCapabilities(chromeOptions)
            .withCreateContainerCmdModifier(cmd -> {
                // 移除默认的/dev/shm绑定挂载
                cmd.getHostConfig().getBinds().removeIf(bind -> bind.getPath().contains("/dev/shm"));
                
                // 在Bitbucket允许的目录下创建临时目录替代/dev/shm
                String cloneDir = System.getenv("BITBUCKET_CLONE_DIR");
                if (cloneDir != null) {
                    String tmpShmDir = cloneDir + "/.tmp-shm";
                    new File(tmpShmDir).mkdirs();
                    // 将临时目录挂载到容器的/dev/shm路径
                    cmd.getHostConfig().withBinds(Bind.bind(tmpShmDir).to("/dev/shm"));
                }
            });

    @Test
    public void openWikipedia() {
        WebDriver driver = new RemoteWebDriver(driverContainer.getSeleniumAddress(), chromeOptions);
        driver.navigate().to("https://www.wikipedia.org/");
        String subtitleText = driver.findElement(By.cssSelector("#www-wikipedia-org h1 strong")).getText();
        assert subtitleText.equals("The Free Encyclopedia");
        driver.quit();
        System.out.println("Finished opening wikipedia. 📖 🤓  🔍 👍  ✨");
    }
}

方法2:升级Testcontainers版本(可选)

Testcontainers 1.18及以上版本对Bitbucket Pipelines的兼容性有所优化,可能已经默认处理了这类挂载限制。如果项目允许,尝试将Testcontainers依赖升级到最新稳定版,无需修改代码即可解决问题。

补充配置优化

在bitbucket-pipelines.yml中添加几个环境变量,避免其他潜在的Testcontainers兼容性问题:

pipelines:
  default:
    - step:
        image: amazoncorretto:11
        services:
          - docker
        script:
          - export TESTCONTAINERS_RYUK_DISABLED=true
          - export TESTCONTAINERS_HOST_OVERRIDE=localhost
          - export TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE=/var/run/docker.sock
          - cd selenium-test ; bash ./mvnw --no-transfer-progress test

definitions:
  services:
    docker:
      memory: 2048

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:15:34