Rails7+ESBuild+Sass容器启动失败:缺失依赖Gem求助
解决方案
一、修复Gem依赖缺失问题
- 确保Dockerfile中执行了
bundle install,且覆盖所有环境依赖的Gem(包括jsbundling-rails、cssbundling-rails这类开发组Gem)。如果Gemfile里这些Gem放在:development组,构建时要指定包含开发环境:# 安装除生产环境外的所有Gem RUN bundle install --without production # 若需要全环境Gem,直接用: # RUN bundle install - 检查
docker-compose.yml是否挂载了本地vendor/bundle目录,若挂载可能导致容器bundle缓存与本地不一致,暂时注释该挂载后重新构建:# 注释此行,执行重新构建 # - ./vendor/bundle:/usr/local/bundle - 构建镜像时禁用缓存,避免旧缓存导致Gem未安装:
docker-compose build --no-cache web
二、解决yarn命令未找到问题
Rails7的jsbundling依赖yarn,需在Docker镜像中安装Node.js和yarn:
- 在Dockerfile中添加安装步骤(以ruby:3.2-slim基础镜像为例):
# 安装Node.js依赖 RUN apt-get update && apt-get install -y curl gnupg RUN curl -sL https://deb.nodesource.com/setup_20.x | bash - RUN apt-get install -y nodejs # 全局安装yarn RUN npm install -g yarn
三、确保bin/dev脚本依赖正常
本地bin/dev通过foreman启动,容器内需确保foreman已安装:
- 若Gemfile未包含foreman,添加
gem 'foreman'后重新执行bundle install;也可直接在Dockerfile中安装:RUN gem install foreman
四、适配Rails7的完整Dockerfile示例
FROM ruby:3.2.2-slim # 安装系统基础依赖 RUN apt-get update && apt-get install -y \ build-essential \ libpq-dev \ curl \ gnupg \ nodejs \ && rm -rf /var/lib/apt/lists/* # 安装yarn RUN curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor -o /usr/share/keyrings/yarnkey.gpg RUN echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main" | tee /etc/apt/sources.list.d/yarn.list RUN apt-get update && apt-get install -y yarn # 设置工作目录 WORKDIR /app # 提前复制Gem文件,利用Docker缓存优化构建 COPY Gemfile Gemfile.lock ./ RUN bundle install --without production # 复制项目文件 COPY . . # 预安装前端依赖(开发环境可选,但bin/dev可能需要) RUN yarn install # 启动命令 CMD ["bin/dev"]
五、docker-compose.yml配置注意事项
version: '3.8' services: web: build: . volumes: - .:/app # 若需要缓存bundle,需确保容器内目录权限正常,可先注释调试 # - bundle:/usr/local/bundle ports: - "3000:3000" depends_on: - db - redis environment: - RAILS_ENV=development - DATABASE_URL=postgres://postgres:password@db:5432/your_app_development - REDIS_URL=redis://redis:6379/0 db: image: postgres:15-alpine volumes: - postgres_data:/var/lib/postgresql/data environment: - POSTGRES_PASSWORD=password redis: image: redis:7-alpine volumes: - redis_data:/data volumes: postgres_data: redis_data: # bundle:
六、验证步骤
- 清理旧容器与镜像:
docker-compose down -v --rmi all - 重新构建并启动:
docker-compose up --build - 查看容器日志,确认Gem安装完成、yarn命令可用、bin/dev正常启动。
内容的提问来源于stack exchange,提问作者Darcy
相关产品推荐
相关产品推荐

