GitLab Runner构建Docker镜像报错No subsystem for mount求助
解决方案
1. 修正.gitlab-ci.yml的Docker配置
- 替换过时的Docker驱动:将
DOCKER_DRIVER: overlay改为DOCKER_DRIVER: overlay2,overlay驱动已被官方弃用,overlay2是当前推荐的稳定驱动,能避免cgroup挂载相关问题。 - 添加dind必需的TLS变量:在
variables块中补充以下配置,确保Docker-in-Docker服务能正常建立安全连接:DOCKER_HOST: tcp://docker:2376 DOCKER_TLS_CERTDIR: "/certs" DOCKER_TLS_VERIFY: 1 - 给docker-build任务添加
needs: ["yarn-build"],确保先获取build阶段的产物再执行镜像构建。
修改后的完整.gitlab-ci.yml示例:
image: gitlab/dind services: - docker:dind variables: DOCKER_DRIVER: overlay2 DOCKER_HOST: tcp://docker:2376 DOCKER_TLS_CERTDIR: "/certs" DOCKER_TLS_VERIFY: 1 stages: - build - docker-build cache: paths: - node_modules yarn-build: stage: build image: node:latest script: - unset CI - yarn install - yarn build artifacts: expire_in: 1 hour paths: - build docker-build: stage: docker-build needs: ["yarn-build"] script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker build -t $CI_REGISTRY_USER/$app_name . - docker push $CI_REGISTRY_USER/$app_name
2. 确保GitLab Runner以特权模式运行
Docker-in-Docker需要特权权限才能正确挂载cgroup等系统资源,修改runner配置:
- 编辑runner配置文件(通常路径为
/etc/gitlab-runner/config.toml),找到对应runner的配置段,设置privileged = true - 重启GitLab Runner服务:
gitlab-runner restart
3. 优化Dockerfile构建流程(可选)
既然CI流水线已经单独完成了前端构建,无需在Docker镜像构建阶段重复执行npm操作,简化后的Dockerfile如下:
FROM nginx:stable COPY build /usr/share/nginx/html RUN rm /etc/nginx/conf.d/default.conf COPY nginx/nginx.conf /etc/nginx/conf.d EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
这样既减少了镜像构建时间,也避免了容器内构建过程中可能触发的cgroup问题。
4. 检查主机cgroup配置
- 执行
mount | grep cgroup查看主机cgroup版本,如果是cgroup v2,确保Docker版本在20.10及以上(该版本开始支持cgroup v2) - 若使用cgroup v1,确认主机cgroup子系统正常挂载,没有异常配置
内容的提问来源于stack exchange,提问作者Shashi Prakash
相关产品推荐
相关产品推荐

