docker build 卡在 pm2 start

问题描述

我想创建一个 docker 容器。我写了一个这样的 Docker 文件

FROM node:12-buster

workdir /opt/myapps/
copY . /opt/myapps/

RUN apt update
RUN apt upgrade -y
RUN apt install git -y

RUN git config --global user.email "user@git.com"
RUN git config --global user.name "user"
RUN npm install -g pm2
RUN pm2-runtime main.js
RUN pm2 save
RUN chmod +x /opt/myapps/entrypoint.sh

EXPOSE 4001

CMD ["./entrypoint.sh"]

这是我的入口点.sh

#!/bin/bash

#node thing
npm install
#npm start
pm2-runtime main.js --exp-backoff-restart-delay=100

当我进行构建时,它肯定会卡在这样的最终过程中

Step 10/14 : RUN pm2-runtime main.js
 ---> Running in 6061a8236379
2021-03-09T12:38:20: PM2 log: Launching in no daemon mode
2021-03-09T12:38:20: PM2 log: App [main:0] starting in -fork mode-
2021-03-09T12:38:20: PM2 log: App [main:0] online
Server started on port :4001

当它到达那里时,这个过程从未继续。有谁知道为什么会这样?我对 docker 世界很陌生

解决方法

docker 中的一个 RUN 步骤执行命令,等待命令退出,并将容器文件系统的更改捕获为镜像中的新层。因此 docker 会一直等到 pm2 start 命令退出,它似乎不会退出,因为它是一个在端口上侦听请求的服务。

对于运行服务,您通常希望此运行作为容器的入口点,以便在容器运行时访问服务,而不是在构建映像期间启动它。

概括而言,您希望将事物分为三个部分:

  1. 应用程序的二进制文件和库安装,这些进入使用 Dockerfile 创建的映像
  2. 持久数据,这是一个卷
  3. 配置,这在撰写文件、kubernetes 清单、环境变量中,或作为文件注入卷中