首页 > 解决方案 > 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"]

这是我的 entrypoint.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

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

标签: node.jsdockerbuildcontainerspm2

解决方案


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

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

在高层次上,您希望将事物分成三个桶:

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

推荐阅读