如何配置Docker容器间共享volume让测试套件读取webdriver下载文件
你的需求完全可以通过Docker Compose的共享named volume实现,当前问题优先排查挂载路径配置错误和权限不匹配两个常见问题。
核心错误定位
你当前配置中最可能的问题是suite服务的共享卷挂载路径配置错误:
Docker Compose中卷挂载的格式为[卷名/宿主机路径]:[容器内目标路径],你使用的${PWD}是宿主机的当前工作目录变量,会被解析为宿主机的路径作为容器内的挂载目标,而suite容器内部的项目路径和宿主机路径并不一致,导致共享卷实际挂载到了suite容器内测试代码不会读取的路径,自然找不到文件。
排查步骤
- 第一步:确认suite容器内的downloads目录绝对路径
启动一个临时的suite容器,结合System.getProperty("user.dir")的输出和项目部署结构,拿到downloads目录在suite容器内的绝对路径,比如结果为/opt/test-suite/downloads。 - 第二步:修正compose挂载配置
将suite服务的volumes配置修改为shared:[你上一步拿到的suite容器内downloads绝对路径],不要保留${PWD}变量。 - 第三步:验证挂载正确性
重新启动服务后,分别进入两个容器执行挂载检查:- 在chrome容器执行
ls /home/seluser,确认下载的文件存在 - 在suite容器执行
ls [你配置的容器内downloads路径],看是否能看到相同的文件 - 如果能看到文件,说明挂载配置正常,进入下一步权限排查;如果看不到,重新检查路径配置是否正确。
- 在chrome容器执行
- 第四步:权限问题排查
如果能看到文件但测试代码读取失败,分别在两个容器执行ls -l [文件路径]查看文件的所属用户、组和权限:
chrome容器默认使用seluser用户运行,UID通常为1000,如果suite容器的运行用户UID不同,会没有权限读取文件。你可以选择给两个服务指定相同的运行用户,或者配置chrome的下载文件默认权限为全局可读即可。
修正后配置示例(假设suite容器内downloads路径为/app/downloads)
version: "3.7" services: suite: build: . command: > mvn -Dbrowser=chrome_headless_remote -Dbrowser_url=http://chrome:4444/wd/hub -Dcucumber.filter.tags="${TAGS}" test volumes: - shared:/app/downloads depends_on: - chrome chrome: image: seleniarm/standalone-chromium:4.0.0-beta-1-20210215 container_name: chromium-m1 shm_size: 2gb ports: - "4444:4444" volumes: - shared:/home/seluser/ volumes: shared:
内容的提问来源于stack exchange,提问作者Brazen
相关产品推荐
相关产品推荐

