docker build 镜像构建失败 return code 137

698次阅读
没有评论

问题

在一个 python 镜像中, 要用到 pip install -r requirementsFROM 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 基本配置信息
image.png

服务器就2G内存, docker 可以使用 memory 是 1.936GiB

docker build 镜像构建失败 return code 137

最后一行则表示 docker 容器会尽可能的使用宿主的CPU和内存资源. 这也是Linux系统下 docker 的默认设置

这意味着 docker container 容器部署时, 已经充分利用容器内存.

top 命令, 一开始是稳定 5% MEM, 突然飙升到 40%, 然后就 killed 了

似乎只能升级服务器内存呢. 最后还是放弃使用 docker 部署, 直接在主机上安装python环境.

问题的原因是因为 requirement.txt 中需要安装的包过大, (如 PyTorch 和 TensorFlow 都需要安装). pip 没有足够的内存进行安装, 导致使用的内存过多而被系统检测发送 SIGKILL 终止创建.

Docker 使用采用 Linux 的 subsystem 技术, 实现对容器内进程使用资源做限制和跟踪

参考

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 
评论(没有评论)