DigitalOcean上Docker构建yarn install报137错误码问题咨询
故障根因
命令返回非零码137的本质是进程收到系统发送的SIGKILL信号被强制终止,你这个场景属于Docker构建阶段内存不足触发OOM(内存溢出):
- 你更换的是缩容后的小规格Droplet,总内存比之前正常运行的实例低,且DigitalOcean小规格机型默认不分配swap交换空间
- 报错节点恰好是
yarn install --frozen-lockfile的最终步骤,这个阶段yarn会解压依赖包、编译原生Node模块,内存占用峰值很高,内存不够时系统会直接杀掉占内存最高的构建进程 - 旧版本Docker默认开启的BuildKit组件会额外占用构建内存,也会放大这个问题。
修复方案
按以下顺序操作,第一步就能解决绝大多数同类问题:
- 给系统添加2G swap交换空间,执行以下命令:
配置完成后直接重新执行# 创建2G大小的swap文件 fallocate -l 2G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile # 配置开机自动挂载swap echo '/swapfile none swap sw 0 0' >> /etc/fstabdocker-compose build构建即可。 - 如果加完swap仍报错,调整Docker服务配置放开内存限制、关闭高内存占用的BuildKit:
新建Docker服务配置文件/etc/systemd/system/docker.service.d/override.conf,写入以下内容:
执行以下命令重载配置重启Docker:[Service] ExecStart= ExecStart=/usr/bin/dockerd --default-ulimit memlock=-1:-1 --buildkit=falsesystemctl daemon-reload systemctl restart docker - 可选优化,降低构建阶段内存峰值:
你当前的Dockerfile重复复制了3次.env.local,存在冗余构建层,可以删掉多余的复制步骤;另外可以调整依赖安装逻辑,把依赖的脚本编译步骤后移到builder阶段,降低deps阶段的内存占用:- 把deps阶段的yarn安装命令修改为
RUN yarn install --frozen-lockfile --network-timeout 100000 --ignore-scripts - 在builder阶段的
RUN yarn build命令前,新增一行RUN yarn install --frozen-lockfile --offline
- 把deps阶段的yarn安装命令修改为
- 兜底方案:如果以上操作全部完成还是构建失败,说明你选的Droplet规格内存过小(512M及以下内存机型即使加swap,跑Next.js构建也容易出现资源不足),Next.js项目构建最低要求1G内存的机型。
内容的提问来源于stack exchange,提问作者Loudrous
相关产品推荐
相关产品推荐

