在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
相关产品推荐
相关产品推荐

