GitHub Actions中Docker挂载卷报错:绑定源路径不存在的解决方法
问题
配置GitHub Actions工作流时,尝试在Docker容器内运行测试并挂载仓库中的coverage目录,执行时触发错误:
Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /home/runner/work/WebUi/WebUi/QualityControl/coverage
场景说明
- 项目存储于GitHub仓库
- 在GitHub Actions工作流中尝试创建
QualityControl/coverage目录 - 通过Docker Compose挂载该目录到容器,用于生成测试覆盖率报告
相关配置
GitHub Actions工作流配置
jobs: coverage: runs-on: ubuntu-latest steps: - name: Create Coverage Directory run: mkdir -p QualityControl/coverage && ls -ld QualityControl/coverage - uses: actions/checkout@v4 - run: (cd QualityControl; npm ci) - run: (cd QualityControl; npm run docker-coverage)
Docker Compose配置
services: test_app: build: target: coverage command: ["/opt/wait-for-it.sh", "-t", "0", "test_db:3306", "--", "npm", "run", "coverage-lcov"] volumes: - type: bind source: ./coverage target: /usr/src/app/coverage read_only: false
已尝试操作
- 使用
mkdir -p和ls命令确认coverage目录已创建 - 在docker-compose.yml中交替尝试绝对路径与相对路径
- 确保
docker-compose命令在QualityControl目录内执行
解决方案
核心原因
你将创建coverage目录的步骤放在了actions/checkout@v4之前,而checkout步骤会把仓库代码完整拉取到工作目录,直接覆盖掉之前创建的QualityControl/coverage目录(甚至可能替换整个QualityControl文件夹),导致后续Docker挂载时找不到指定路径。
修复步骤
- 调整步骤顺序
将Create Coverage Directory步骤移到actions/checkout@v4之后,确保目录创建在拉取完成的仓库工作目录中:
jobs: coverage: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Create Coverage Directory run: mkdir -p QualityControl/coverage && ls -ld QualityControl/coverage - run: (cd QualityControl; npm ci) - run: (cd QualityControl; npm run docker-coverage)
确认挂载路径有效性
Docker Compose中使用的./coverage相对路径是基于执行docker-compose命令的目录(即QualityControl),调整步骤顺序后,该路径会指向正确创建的QualityControl/coverage目录,Docker就能识别到挂载源。备选方案:容器内自动创建目录
如果不想手动在宿主机创建目录,可以修改Docker Compose,让容器启动时自动生成目标目录(注意权限适配):
services: test_app: build: target: coverage command: ["/opt/wait-for-it.sh", "-t", "0", "test_db:3306", "--", "npm", "run", "coverage-lcov"] volumes: - type: bind source: ./coverage target: /usr/src/app/coverage read_only: false entrypoint: ["sh", "-c", "mkdir -p /usr/src/app/coverage && exec $0 $@"]
内容的提问来源于stack exchange,提问作者Alejandro Mariscal Romero
相关产品推荐
相关产品推荐

