基于Ubuntu的Heroku 18镜像中带C扩展的Ruby Gems无法构建
嘿,我来帮你搞定这两个问题——先解决你关心的Cedar-14装新版Node的简便方法,再搞定heroku:18镜像下C扩展gem装不上的难题!
一、在Cedar-14镜像中安装新版Node.js的简便方案
如果不想升级基础镜像,用**nvm(Node Version Manager)**是最灵活省心的方式,既能快速安装符合Webpacker要求的Node版本,还能随时切换:
在你的Cedar-14 Dockerfile里加上这些步骤:
# 安装nvm RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # 加载nvm并安装Node 16.x(Webpacker兼容的稳定版本,选>=6.0.0的版本都可以) RUN export NVM_DIR="$HOME/.nvm" && \ [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" && \ nvm install 16.x && \ nvm alias default 16.x # 让Node和npm在全局环境生效 RUN echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.bashrc && \ echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> ~/.bashrc
这样就能在Cedar-14里用上符合要求的Node版本,不用折腾升级基础镜像。
二、解决heroku/heroku:18镜像下C扩展gem安装失败的问题
你碰到的错误核心是Ruby缺少编译C扩展所需的开发头文件,即使装了build-essential也没用,因为手动解压的Ruby包可能是runtime版本,不带开发组件。下面是两种解决方案:
方案1:改用heroku/heroku:18-build镜像 + 官方apt装Ruby(推荐)
heroku/heroku:18-build是专门的构建镜像,已经预装了所有编译工具(build-essential、libpq-dev这些),直接用apt装带开发头文件的Ruby,就能避免手动解压的坑:
FROM heroku/heroku:18-build # 安装符合Webpacker要求的Node.js RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - && \ apt-get install -y --no-recommends nodejs # 安装Ruby 2.5.0和对应的开发包(自带编译C扩展需要的头文件) RUN apt-get install -y --no-recommends ruby2.5 ruby2.5-dev # 设置gem环境(如果需要自定义gem存储路径的话) ENV GEM_HOME=/ruby/gems GEM_PATH=/ruby/gems RUN gem install bundler:2.3.0 # 选和Ruby 2.5兼容的bundler版本 # 切换到项目目录,安装依赖 WORKDIR /app COPY Gemfile Gemfile.lock ./ RUN bundle install --without development test
方案2:修复手动安装Ruby的缺失问题
如果一定要手动下载Ruby tar包,得确保包带开发头文件,或者补充安装Ruby开发依赖:
FROM heroku/heroku:18-build # 先装编译工具和Node.js RUN apt-get update && \ apt-get install -y --no-recommends build-essential libpq-dev nodejs # 下载解压Ruby 2.5.0包(要确认tar包里有include/ruby-2.5.0目录,也就是开发头文件) RUN mkdir -p /ruby && cd /ruby && \ curl https://s3-external-1.amazonaws.com/heroku-buildpack-ruby/heroku-18/ruby-2.5.0.tgz -s -o - | tar xzf - --no-same-owner # 如果手动解压的Ruby缺开发头文件,用apt补充 RUN apt-get install -y --no-recommends ruby2.5-dev ENV GEM_HOME=/ruby/gems GEM_PATH=/ruby/gems RUN gem install bundler WORKDIR /app COPY Gemfile Gemfile.lock ./ RUN bundle install
关键提醒:
- heroku/heroku:18是运行时镜像,只够跑程序,没有编译工具;而heroku/heroku:18-build是构建镜像,预装了所有编译依赖,构建阶段优先用它。
- 你之前手动解压的Ruby tar包大概率是runtime版本,缺了
ruby.h这类编译C扩展必须的头文件,这才是报错的根本原因,补充ruby-dev包或者换带dev的Ruby包就能解决。
内容的提问来源于stack exchange,提问作者JacobEvelyn
相关产品推荐
相关产品推荐

