先放 Gemfile 和 Dockerfile
# Dockerfile
FROM ruby:3.0.0-alpine
ENV BUNDLER_VERSION=2.2.6
RUN apk --no-cache add postgresql-client \
vim \
yarn \
wget \
gcc \
autoconf \
libc-dev \
linux-headers \
make \
libxml2-dev \
libressl-dev \
postgresql-dev \
libffi-dev \
readline-dev \
yaml-dev \
tzdata \
git \
nodejs \
less \
curl \
g++ \
ca-certificates \
imagemagick \
build-base \
ruby-dev \
libxslt-dev \
libcurl
RUN gem install bundler -v 2.2.6
WORKDIR /app
COPY Gemfile Gemfile.lock ./
# Cuz it'd be extremely slow not doing so
RUN gem install sassc --version 2.4.0
RUN bundle config build.nokogiri --use-system-libraries
RUN bundle check || bundle install
COPY package.json yarn.lock ./
RUN yarn install --check-files
COPY . ./
# Gemfile
source "https://rubygems.org"
ruby '3.0.0'
gem 'rails', '~> 6.0.4'
gem 'puma', '~> 4.1'
gem 'sass-rails', '>= 6'
gem 'webpacker', '~> 4.0'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.7'
gem 'bootsnap', '>= 1.4.2', require: false
group :development, :test do
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end
group :development do
gem 'pry-rails'
gem 'web-console', '>= 3.3.0'
gem 'listen', '~> 3.2'
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
end
group :test do
gem 'capybara', '>= 2.15'
gem 'selenium-webdriver'
gem 'webdrivers'
end
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
gem 'pg', '~>1.1.3'
gem 'sidekiq', '~>6.0.0'
gem "sidekiq-scheduler"
gem 'react-rails'
在本地 Mac 上打包,一切正常。但是在 ubuntu 的 vps (1G/1C) 上,执行到 bundle install 时,会在 sassc 2.4.0 的 build native extensions 那一步卡的非常非常久。并且 CPU 和内存在这一步的时间段里,基本上占用都是 80% 左右。
但独执行写一行 RUN 来安装 sassc,可以解决这个问题,也可以拿 Mac 上打包好的作为个基础 image 解决问题。
但我有一个问题不太明白。 bundle install 和 gem install 无非是一个用 bundle 来负责安装。bundle 在安装的版本上会做出最兼容的选择,比如 A 和 B 都需要 sassc 的依赖的情况下。但我已经在 Gemfile 中明确指明 2.4 版本,依然在 ubuntu 中失败。既然和版本没关系,为什么: