docker build 镜像构建失败 return code 137

问题 在一个 python 镜像中, 要用到 pip install -r requirements

FROM python:3.7 WORKDIR /code EXPOSE 80 COPY ./code/requirements.txt requirements.txt RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:80", "wsgi:app"]

但是在构建镜像的过程中, 正常情况下, docker 会将容器内一切信息打印出来.
但 build 过程中, docker 容器非正常退出. 错误信息没有报出来
docker build 镜像构建失败 return code 137
文章图片

说实话, 很抽象. 仅有return code 137
哪怕镜像没有构建完成, 可以通过 docker ps -a 查看镜像构建时的退出码
docker build 镜像构建失败 return code 137
文章图片

但无法使用 docker logs 命令查看尚未构建好的镜像的日志
按道理而言, 若 pip 命令出错, docker build 会将错误信息打印出来. 但 killed 表示 docker 容器是非正常退出.
而该 return code 137 有很多种原因出现
  • 容器接受到 SIGKILL 信号, 通常情况下代表容器内存溢出, 导致程序异常退出
  • 容器被 docker 发送命令, 命令强制关闭容器
利用 top 命令监控
docker build 镜像构建失败 return code 137
文章图片

top命令执行后, 按 m 键会按照使用内存降序排序
解决办法 调整 docker container 的内存限制
使用 docker info 命令, 查看 docker 基本配置信息
docker build 镜像构建失败 return code 137
文章图片

服务器就2G内存, docker 可以使用 memory 是 1.936GiB
docker build 镜像构建失败 return code 137
文章图片

最后一行则表示 docker 容器会尽可能的使用宿主的CPU和内存资源. 这也是Linux系统下 docker 的默认设置
这意味着 docker container 容器部署时, 已经充分利用容器内存.
top 命令, 一开始是稳定 5% MEM, 突然飙升到 40%, 然后就 killed 了
似乎只能升级服务器内存呢. 最后还是放弃使用 docker 部署, 直接在主机上安装python环境.
【docker build 镜像构建失败 return code 137】问题的原因是因为 requirement.txt 中需要安装的包过大, (如 PyTorch 和 TensorFlow 都需要安装). pip 没有足够的内存进行安装, 导致使用的内存过多而被系统检测发送 SIGKILL 终止创建.
Docker 使用采用 Linux 的 subsystem 技术, 实现对容器内进程使用资源做限制和跟踪
参考
  • Docker-compose exit code is 137 when there is no OOM exception
  • How to increase/check default memory Docker has on linux?
  • Understanding Docker Container Exit Codes

    推荐阅读