How to start pm2 server in a docker container

直接在 docker 的 container 中运行 PM2 可能会遇到以下问题:

1
PM2 dameon PID = 1
0 with /.pm2/pm2.log file not found

这是因为 /.pm2 目录不存在造成的。可能很多人此时会想到去创建该目录,事实上是不必要的,比较好的做法是使用官方提供的 dump 命令。

运行 PM2 的 Dockerfile ,可以参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM node:0.11.13
# or just node, without tag

RUN npm install -g pm2
RUN pm2 dump
# dump will start pm2 daemon and create everything needed

VOLUME ["/srv/apps", "/srv/logs", "/srv/server.json"]
# don't put the files in docker container, user -v

EXPOSE 3000

CMD ["pm2", "start", "/srv/server.json", "--no-daemon"]
# no daemon mode for docker

搞定。

Dash is not bash

在一些 docker 官方 Image 中,执行一些 .sh 文件的时候遇到了一些奇怪现象,比如:

1
2
3
# Run something like:
[[ $ABC =~ regexp ]]
#> [[: not found

其实是因为此 Image 中 sh 并非 bash,而是 dash:

1
2
ls -l /bin/sh
#> /bin/sh -> dash

此时,只需重置 sh 就好了:

1
2
rm /bin/sh
ln -s /bin/bash /bin/sh

不过,在 docker image 里,还是不建议执行 .sh 文件。所有事情都在 host 上完成,之后 -v 共享目录给 docker container 为好。

参考