Ruby + Alpine Docker环境已安装git但执行bundle install仍提示找不到git
核心原因
你遇到的报错本质是bundle install执行时,构建环境中没有可执行的git命令,常见诱因有两种:
- 你混淆了Drone流水线的执行环境和Docker镜像构建的内部环境:Drone日志里显示的git安装是Drone宿主机/执行器的前置操作,和Docker构建过程内的系统环境完全隔离,不代表Docker镜像构建阶段真的装好了git
- Docker构建缓存失效:CI环境中如果开启了构建缓存,之前缓存的
apk add层可能没有成功安装git,后续构建直接复用了失效缓存
解决办法
按优先级从高到低尝试:
- 首先禁用Docker构建缓存:在Drone的Docker构建插件配置中新增
no_cache: true参数,或是给docker build命令加上--no-cache选项,强制重新执行所有构建步骤,避免缓存导致的git缺失 - 调整Dockerfile指令顺序,把依赖安装和bundle操作合并到同一层,确保每次执行bundle前git一定存在,还可以在安装完成后删除构建依赖减小镜像体积:
##################################### # Backend Dependencies ##################################### FROM ruby:3.0.2-alpine3.14 AS vendor # 先拷贝Gemfile再装依赖、执行bundle COPY Gemfile Gemfile.lock ./ RUN apk add --no-cache \ sqlite-dev postgresql-dev \ git build-base && \ bundle config set --local deployment "true" && \ bundle config set --local without "development,test" && \ bundle install && \ # 可选:删除构建依赖减小镜像体积 apk del git build-base
- 若仍报错,可在bundle install前添加调试指令确认git状态,同时显式指定git的绝对路径给bundler:
RUN apk add --no-cache \ sqlite-dev postgresql-dev \ git build-base && \ # 调试指令,构建时会输出git的安装状态 which git && git --version && \ # 显式指定git路径 bundle config set --local git /usr/bin/git && \ bundle config set --local deployment "true" && \ bundle config set --local without "development,test" && \ bundle install
- 长期规避方案:放弃git源安装gem,将兼容版本的sunspot_rails源码放到项目vendor目录下,用path源引入,完全消除构建时对git的依赖:
# Gemfile中修改为 gem 'sunspot_rails', path: 'vendor/sunspot_rails'
内容的提问来源于stack exchange,提问作者Sirius
相关产品推荐
相关产品推荐

