Fly部署失败:执行bundle exec rails assets:precompile报错求助
针对你遇到的本地预编译正常,但Docker部署Fly时bundle exec rails assets:precompile报错project@workspace:.: This package doesn't seem to be present in your lockfile的问题,可从以下几个方向排查解决:
Docker构建上下文缺失关键文件
检查.dockerignore配置,是否误将yarn.lock、.yarnrc.yml、.yarn目录(Yarn 3+版本需保留)或workspace相关的package.json文件排除在外。Yarn 3的berry版本依赖这些文件解析workspace结构,缺失会导致容器内无法识别workspace包。
解决:修改.dockerignore,确保上述文件/目录不在忽略列表;若为monorepo,需保证所有workspace子包的package.json都在Docker构建上下文范围内。容器与本地Yarn版本不匹配
报错显示容器内使用Yarn 3.3.0,若本地Yarn版本不同,生成的yarn.lock格式可能存在差异,导致容器内Yarn无法正确解析workspace依赖。
解决:在Dockerfile中指定与本地一致的Yarn版本,比如通过Volta安装:RUN volta install yarn@<你的本地Yarn版本号>或直接使用对应版本的Node镜像(如
node:18-yarn-3.3)。构建阶段未正确执行Yarn安装
若Dockerfile中在预编译assets前未执行yarn install,或安装步骤参数错误,会导致容器内依赖未正确安装,lockfile不匹配。Yarn 3默认启用--immutable模式,lockfile与package.json不一致会直接报错。
解决:在预编译步骤前添加正确的依赖安装逻辑,确保复制完整的依赖配置文件:COPY package.json yarn.lock .yarnrc.yml ./ COPY .yarn ./.yarn RUN yarn install --immutable --immutable-cache同时确保本地重新生成的
yarn.lock已提交到代码仓库,保证Docker构建时能获取到最新的lockfile。预编译环境变量配置问题
Rails预编译时的环境变量(如RAILS_ENV、NODE_ENV)会影响Yarn的依赖安装行为。若容器内设置为production环境,Yarn会默认忽略devDependencies,如果workspace包依赖dev依赖,可能导致解析失败。
解决:在Dockerfile中明确设置预编译环境变量,若确实需要dev依赖(不建议生产环境使用),可调整Yarn安装参数:ENV RAILS_ENV=production ENV NODE_ENV=production # 若需保留dev依赖,添加以下参数 # RUN yarn install --immutable --immutable-cache --production=falseYarn workspace路径与容器工作目录不匹配
检查package.json中的workspaces配置是否为相对路径,同时确认Dockerfile的WORKDIR设置是否与本地项目结构一致。若容器内工作目录与本地不同,workspace的相对路径会失效,导致Yarn无法找到对应包。
解决:设置Dockerfile的WORKDIR为项目根目录(如WORKDIR /app),并将所有项目文件复制到该目录下,保证workspace路径在容器内有效。
内容的提问来源于stack exchange,提问作者tfantina

