nodejs 응용 프로그램을 dockerizing-컨테이너를 처음 시작할 때 pm2 ls가 작동해야합니까?
다음 익스프레스 / 노드 애플리케이션이 있습니다.
FROM node:12
WORKDIR /usr/share/jtapp
COPY package*.json ./
RUN apt-get update
RUN apt-get install -y net-tools
RUN npm install
RUN npm install pm2@latest -g
#RUN npm ci --only=production
COPY . .
EXPOSE 3000
RUN pm2 start server.js
잘 구축 된 것 같습니다. 그러나 이미지를 시작하고 bash를 통해 첨부하면 pm2 프로세스가 실행되지 않습니다.
빌드 결과는 다음과 같습니다.
Sending build context to Docker daemon 319.5kB Step 1/10 : FROM node:12 ---> cfcf3e70099d Step 2/10 : WORKDIR /usr/share/jtapp ---> Using cache ---> 2c2e2e1e92f2 Step 3/10 : COPY package*.json ./ ---> Using cache ---> 57829fd5e9d7 Step 4/10 : RUN apt-get update ---> Using cache ---> c0bbfed43ca8 Step 5/10 : RUN apt-get install -y net-tools ---> Using cache ---> 0b34759d8298 Step 6/10 : RUN npm install ---> Using cache ---> 6abc42a9f8a3 Step 7/10 : RUN npm install pm2@latest -g ---> Running in 2fafacd302bf /usr/local/bin/pm2 -> /usr/local/lib/node_modules/pm2/bin/pm2 /usr/local/bin/pm2-dev -> /usr/local/lib/node_modules/pm2/bin/pm2-dev /usr/local/bin/pm2-docker -> /usr/local/lib/node_modules/pm2/bin/pm2-docker /usr/local/bin/pm2-runtime -> /usr/local/lib/node_modules/pm2/bin/pm2-runtime
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@~2.1.2 (node_modules/pm2/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
+ [email protected]
added 185 packages from 191 contributors in 10.165s
Removing intermediate container 2fafacd302bf
---> 11d15b993ca2
Step 8/10 : COPY . .
---> efab8283bbd9
Step 9/10 : EXPOSE 3000
---> Running in aae343a75727
Removing intermediate container aae343a75727
---> b97825863317
Step 10/10 : RUN pm2 start server.js
---> Running in f0d14c61a3a6
[PM2] Spawning PM2 daemon with pm2_home=/root/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /usr/share/jtapp/server.js in fork_mode (1 instance)
[PM2] Done.
┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼───────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ server │ default │ 1.0.0 │ fork │ 28 │ 0s │ 0 │ online │ 0% │ 28.2mb │ root │ disabled │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
Removing intermediate container f0d14c61a3a6
---> 859f8479f3a6
Successfully built 859f8479f3a6
그런 다음 컨테이너를 시작하고 연결하는 방법입니다.
lab:/var/lib/git/jtapp# docker run -d -it --name jtapp -p 3000:3000 jtapp bash
d62927716ab593376c4e38f7d4d05007223ce2adfcb4997e722b81ad7260f114
lab:/var/lib/git/jtapp # docker exec -it jtapp bash
root@d62927716ab5:/usr/share/jtapp # pm2
usage: pm2 [options] <command>
pm2 -h, --help all available commands and options
pm2 examples display pm2 usage examples
pm2 <command> -h help on a specific command
Access pm2 files in ~/.pm2
root@d62927716ab5:/usr/share/jtapp #
하지만 컨테이너 내부에 있으면 다음과 같이 모든 것을 수동으로 시작할 수 있습니다.
root@d62927716ab5:/usr/share/jtapp# pm2 start server.js
[PM2] Spawning PM2 daemon with pm2_home=/root/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /usr/share/jtapp/server.js in fork_mode (1 instance)
[PM2] Done.
┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼───────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ server │ default │ 1.0.0 │ fork │ 37 │ 0s │ 0 │ online │ 0% │ 28.4mb │ root │ disabled │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
편집 1
변경 :
RUN pm2 start server.js
...에
CMD ["pm2", "start", "server.js"]
그런 다음 컨테이너를 다시 빌드 / 시작하려고했습니다. 내가 "pm2 ls"를 할 때 그것은 여전히 비워집니다.
root@a8b7eb21d307:/usr/share/jtapp# pm2 ls
[PM2] Spawning PM2 daemon with pm2_home=/root/.pm2
[PM2] PM2 Successfully daemonized
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name │ mode │ ↺ │ status │ cpu │ memory │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
2 편집
실행 명령에서 "-d"옵션을 제거하면 :
lab:/var/lib/git/jtappd# docker run -it --name jtapp -p 3000:3000 jtapp bash
root@3cf4855372ec:/usr/share/jtapp# pm2 ls
[PM2] Spawning PM2 daemon with pm2_home=/root/.pm2
[PM2] PM2 Successfully daemonized
┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
root@3cf4855372ec:/usr/share/jtapp#
3 편집
따라서 Dockerfile은 이제 다음과 같습니다.
FROM node:12
WORKDIR /usr/share/jtapp
COPY package*.json ./
RUN apt-get update
RUN apt-get install -y net-tools
RUN npm install
RUN npm install pm2@latest -g
COPY . .
EXPOSE 3000
CMD ["npm", "run", "start:pm2"]
ecosystem.config.js는 다음과 같습니다.
lab:/var/lib/git/jtapp# cat ecosystem.config.js
module.exports = {
apps: [{
name: 'jtapp',
script: './server.js', //entrypoint
instances: 1,
autorestart: true, // pm2 to restart if this app fails/stops
max_memory_restart: '1G'
}]
}
및 package.json의 스크립트 섹션 :
1 {
2 "name": "nodeserver",
3 "version": "1.0.0",
4 "description": "simple node server",
5 "main": "index.js",
6 "scripts": {
7 "test": "echo \"Error: no test specified\" && exit 1",
8 "start": "nodemon server.js",
9 "start:pm2": "pm2 start ecosystem.config.js --no-daemon"
10 },
Dockerfile은 오류없이 빌드됩니다. 하지만 컨테이너를 시작할 때 ... server.js가 실행되고 있지 않습니다. pm2가 설치됩니다.
그러나 아래에서 볼 수 있듯이 컨테이너에 로그인하면 생태계 파일을 사용하여 수동으로 시작하는 데 문제가 없습니다.
root@d51117d757a3:/usr/share/jtapp# pm2 start ecosystem.config.js
[PM2][WARN] Applications jtapp not running, starting...
[PM2] App [jtapp ] launched (1 instances)
┌─────┬──────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼──────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ jtapp │ default │ 1.0.0 │ cluster │ 36 │ 0s │ 0 │ online │ 0% │ 32.6mb │ root │ disabled │
└─────┴──────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
답변
가장 좋은 방법은 ecosystem.config.js
. 이 파일을 프로젝트의 루트 디렉토리에 넣으십시오.
module.exports = {
apps: [{
name: 'app',
script: 'src/index.js', // Your entry point
instances: 1,
autorestart: true, // THIS is the important part, this will tell PM2 to restart your app if it falls over
max_memory_restart: '1G'
}]
}
그런 다음 프로젝트에 npm 모듈로 pm2를 설치하고이 스크립트를 package.json
...
scripts: {
...
"start:pm2":"pm2 start ecosystem.config.js --no-daemon"
}
마지막 으로이 CMD를 dockerfile에서 사용하십시오.
CMD [ "npm", "run", "start:pm2" ]
편집 1
여기에서 원본 dockerfile이있는 샘플 프로젝트를 찾을 수 있습니다.
https://github.com/golkhandani/pm2_docker/tree/master
![](https://post.nghiatu.com/assets/images/s/viLyk.png)
2 편집
방금 다른 Manjaro
Linux로 저장소를 테스트했으며 여기에 명령이 있습니다.
git clone https://github.com/golkhandani/pm2_docker.git
docker build pm2_docker/ --tag pm2docker:test
docker run -p 3000:3000 -t pm2docker:test
-p 3000:3000
서버에 로컬로 액세스 하려면 arg를 추가해야합니다.
다음은 명령 및 결과를 보여주는 추가 스크린 샷입니다.
![](https://post.nghiatu.com/assets/images/s/1Viz8.png)
![](https://post.nghiatu.com/assets/images/s/ajdhX.png)
![](https://post.nghiatu.com/assets/images/s/NhJvR.png)
![](https://post.nghiatu.com/assets/images/s/qTnW9.png)