You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose构建Rails应用时Yarn安装成功却找不到node_modules问题

问题根源

你的配置存在两个核心问题:

  1. Dockerfile 执行顺序错误,依赖层缓存逻辑不合理,且构建生成的node_modules容易被本地复制的文件覆盖
  2. 历史启动生成的空匿名卷未清理,重新构建镜像后旧的空卷会覆盖镜像内新生成的node_modules目录

解决方案

1. 修正Dockerfile配置

调整指令顺序,提前安装Node.js环境,分离依赖安装和代码复制步骤,优化层缓存:

FROM ruby:3.0.0
RUN bundle config --global frozen 1

# 提前安装Node.js和Yarn环境,这层改动频率极低可长期缓存
RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash -
RUN apt-get install -y nodejs
RUN npm install --global yarn

WORKDIR /app

# 安装Ruby依赖
COPY Gemfile Gemfile.lock ./
RUN bundle install

# 单独复制前端依赖声明文件,避免每次改代码都重新执行yarn install
COPY package.json yarn.lock ./
RUN yarn install

# 最后复制剩余业务代码
COPY . .

2. 添加.dockerignore规则

在项目根目录创建.dockerignore文件,添加以下内容,避免本地文件覆盖镜像内构建产物:

node_modules
**/node_modules
tmp
log
.pgdata
.git
.gitignore

3. 清理历史匿名卷

之前启动容器时生成的/app/node_modules匿名卷已经是空状态,即使重新构建镜像,旧卷也不会同步镜像内的新内容,执行以下命令清理旧卷:

docker compose down -v

注意:该命令只会删除匿名卷,你配置的./pgdata本地绑定挂载不受影响,数据库数据不会丢失。

4. 重新构建启动

执行以下命令重新构建并启动服务即可:

docker compose build
docker compose up

补充说明

你当前docker-compose.yml里的卷配置顺序是正确的,/app/node_modules匿名卷在本地绑定挂载之后声明,会自动覆盖本地挂载对应的路径,不需要修改。如果是部署生产环境,建议移除本地目录绑定挂载,直接使用镜像内的所有文件。

内容的提问来源于stack exchange,提问作者Charlie Massry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 02:06:03