dockerizing Nodejs 应用程序 - 当我第一次启动容器时 pm2 ls 应该工作吗

2024-03-21

我有以下快递/节点应用程序:

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] /cdn-cgi/l/email-protection: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

+ [email protected] /cdn-cgi/l/email-protection
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 │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

EDIT 1

Changed:

 RUN pm2 start server.js 

to

 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   │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘

EDIT 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#

EDIT 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'
  }]
}

然后在您的项目中安装 pm2 作为 npm 模块,并将此脚本添加到您的项目中package.json

...
scripts: {
...
  "start:pm2":"pm2 start ecosystem.config.js --no-daemon"
}

最后在你的 dockerfile 中使用这个 CMD

CMD [ "npm", "run", "start:pm2" ]

EDIT 1

您可以在此处找到带有原始 dockerfile 的示例项目:

https://github.com/golkhandani/pm2_docker/tree/master https://github.com/golkhandani/pm2_docker/tree/master

EDIT 2

我刚刚用另一个测试了该仓库Manjarolinux 和 这是命令

git clone https://github.com/golkhandani/pm2_docker.git

docker build pm2_docker/ --tag pm2docker:test

docker run -p 3000:3000 -t pm2docker:test

the -p 3000:3000应添加 arg 以本地访问您的服务器。

这些是显示命令和结果的附加屏幕截图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dockerizing Nodejs 应用程序 - 当我第一次启动容器时 pm2 ls 应该工作吗 的相关文章

  • fs.readFileSync 不是文件相关的? Node.js

    假设我的项目根目录下有一个名为file xml 假设我在tests 中有一个名为 test js 的测试文件 它有 const file fs readFileSync file xml 如果我现在跑步node tests test js从
  • 向回调函数添加附加参数

    我正在 Node js 中构建一个系统 该系统应该查找文件夹数组中的所有文件 统计它们 然后使用该信息执行一些其他工作 我使用 fs readdir 从每个文件夹同步获取所有文件 我的代码如下所示 for i 0 max paths len
  • Mongoose VersionError:保存文档时找不到 id 的匹配文档

    通过 sync API 请求同步用户购物车时 我反复看到以下错误 每当用户更改购物车的内容时就会调用此函数 VersionError 找不到 id 的匹配文档 2y4b1hq601cd013e0af25e32 版本4修改路径 购物车 car
  • Rancher 外部子域

    我需要为 docker 容器中的应用程序设置子域 而不是在内部牧场主网络中 而是供公共使用 我已将域委托给牧场主服务器 并且目录中几乎所有堆栈都有主机属性 但它不起作用 我想我需要使用一些 rancher dns 委托域或设置 nginx
  • 在生产 PostgreSQL 连接中将rejectUnauthorized 设置为 false 可以吗?

    我们最近转移到 Heroku 并在尝试将我们的应用程序连接到数据库时 它不断拒绝我们的查询 并显示消息 自签名证书 传入rejectUnauthorized解决了这个问题 但现在我想知道 我们应该在生产中这样做吗 如果没有 我们连接到 He
  • Mongoose,索引位置数组

    我在文档中有一个位置数组 我想在该数组上添加 2dSpere 索引 那可能吗 var LocationSchema new Schema type type String required true geometry type type S
  • 有没有办法向 JavaScript 对象添加元数据?

    我想将元数据的键值对添加到任意 JavaScript 对象 此元数据不应影响不知道元数据的代码 这意味着例如 JSON stringify obj JSON stringify obj WithMetaData key value 元数据感
  • 如何在 Mongoose 中设置文档创建的 TTL 日期?

    我正在尝试做一个promoCodeMongoose 中的架构 创建时 我需要能够设置促销代码的到期日期 促销代码不一定相同TTL 我在看这个问题 https stackoverflow com questions 14597241 sett
  • 如何使用 compose 将 docker 卷安装到我的 docker 项目中?

    我有一个 Maven 项目 我正在 Docker 内运行 Maven 构建 但问题是 每次运行它时 它都会下载所有 Maven 依赖项 并且不会缓存任何 Maven 下载 我找到了一些解决方法 将本地 m2 文件夹挂载到 Docker 容器
  • nodejs 强大的改变 uploadDir

    我有一个项目正在努力完成我想上传图像 我可以上传图像 但不能上传应该上传的空中图像 好的 让我们编写代码 app post register function req res var form new formidable Incoming
  • Heroku 中的子目录未使用express.static 提供服务

    我看到一些非常奇怪的行为 其中我的一些文件正确地由我的 Express Node 服务器返回 使用express static 但不包括子目录中的文件 令人沮丧的是 它在本地使用 Node 或 foreman 工作得很好 但在 Heroku
  • 稍后如何附加到正在运行的 Docker 容器?

    我想简单地启动一个 docker 容器来执行一些 java 代码 最终启动 JBoss 这工作正常 只是我不知道如何再次连接到容器并返回到 bash 提示符 这就是我启动容器的方式 docker run i t p 80 80 v tmp
  • 如何使用 Jade / Pug 渲染内联 JavaScript?

    我正在尝试使用 Jade http jade lang com 让 JavaScript 在我的页面上呈现 我的项目是在 NodeJS 和 Express 中进行的 一切都正常工作 直到我想在头部编写一些内联 JavaScript 即使采用
  • 如何使用 forEach 删除列表中的元素?

    var people alex jason matt people forEach function p if p length gt 4 REMOVE THIS PERSON or pop it out of the list or wh
  • 让 `npm install --save` 添加严格版本到 package.json

    当你跑步时npm install save somepackage 它通常会在 package json 中添加这样的内容 dependencies somepackage 2 1 0 因为版本前面带有插入符号 这意味着如果您稍后运行npm
  • 检索 Couchbase 的所有记录(文档)

    我正在使用 node js 并寻找一种方法来获取特定的 couchbase 桶的所有文档 有没有没有循环和增量索引的解决方案 我知道我可以制作一个原子键 然后通过循环使用它来检索所有数据 但我需要一个返回所有文档的函数 是否有任何函数 至少
  • 当使用客户端函数填充 DOM 时,如何等待从 puppeteer 中的 page.evaluate 函数加载所有图像

    我试图让代码执行等待所有图像加载之前木偶师截屏 当调用 initData 函数时 我的 DOM 会被填充 该函数是在客户端 js 文件中定义的 延迟或超时是一种选择 但我确信必须有一种更有效的方法来做到这一点 async dataObj g
  • Mocking/Stubbing Mongoose 模型保存方法

    给定一个简单的 Mongoose 模型 import mongoose Schema from mongoose const PostSchema Schema title type String postDate type Date de
  • MongoDB GridFS - 是文件名还是文件名

    请看下图 来自http mongoexplorer com http mongoexplorer com 我一直在尝试通过 GridFS 进行工作 参考https github com jamescarr nodejs mongodb st
  • Javascript增加最大数组大小[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个大小的数组2 32 4294967296 因为我试图通过运行筛算法来获取 2 32 之前的所有素数 但是 该数组中的任何操作都会出现以下错误 致命错误 CALL AND RETRY LAST 分

随机推荐

  • 在 UWP 中创建文件和文件夹

    我查看了很多 stackoverflow 帖子和文章 但仍然无法在 UWP 中创建文件 在 WPF 中这确实很容易 但 UWP 的工作方式有所不同 我在清单文件中添加了以下内容
  • 数据库独立的行级安全解决方案

    有人知道 Java C 数据库独立授权库吗 该库应支持跨公司组织结构的读 写 删除 插入操作 像这样的东西 用户可以查看所有文档 用户可以输入分配给他的单位的新文档 用户可以更改分配给他的单位和所有下属单位的所有文档 用户可以删除分配给他的
  • 计算存储过程的结果

    我有一个返回 ID 名称 描述的存储过程 并且不接受任何输入参数 但是 我对得到多少结果感兴趣 我期待这样的工作 SELECT COUNT FROM EXEC MyStoredProcedure 但我在 Sql Server Managem
  • LVDiff 在 Git 中不起作用

    我正在尝试从元差异套件中获取 lvdiff 以与 Git 一起使用 我的 gitconfig 看起来像这样 gui recentrepo C Users Tanner Desktop FIRST 2010 Beta Java LoganRo
  • GPS定位无服务

    我是一名新开发人员 有一个简单的问题 我已经四处搜索 但尚未找到明确的答案 简而言之 我正在开发一个需要能够使用 GPS 的应用程序 然而 诀窍是我想使用 GPS 来获取手机的位置 即使它们没有运营商服务 话虽如此 我有两个问题 是否可以通
  • 未经授权暴露hangfire

    有没有办法在 IIS 中公开 Hangfire 而无需配置授权 在这种特定情况下 仪表板应该打开 但在访问它时 不是在调试中 它会返回 401 代码 我认为你应该能够编写一个自定义实现IDashboardAuthorizationFilte
  • 如何动态插入Vue组件?

    许多面板 产品 以多行和多列的形式显示在一个页面中 我使用的是 Vue 2 面板是组件 现在 单击一个面板时 我想在该面板的行下方显示该面板的详细信息 这与谷歌图像搜索类似 例如 在上图中 如果我单击 s1 s2 或 s3 中的任何一个 大
  • 如何使用多个$条件对查询进行分组?

    我想像下面这样查询 但这只包含一个 cond 如何查询两个 cond collection aggregate match id in ids group id someField count sum cond eq otherField
  • 产生随机波函数

    我需要在 matplotlib 中生成一条随机曲线 例如 我的 x 值是从 1 到 1000 我不想生成分散的随机 y 值 我需要一条平滑的曲线 就像某种非常扭曲的正弦曲线 具有不同的幅度和波长 是否已经存在一些东西可以让我轻松地做到这一点
  • 如何从 gWidget 和处理程序返回值?

    我正在尝试为 R 包开发 GUI 使用 gWidgets 我的计划是构建一个保存数据的主窗口 并使用按钮为每个函数调用小型 gui 包装器 不幸的是 我陷入了一个基本 问题 我不知道如何传输数据 问题 如何在不同的窗口之间正确发送数据 如何
  • 让聊天机器人 (wit.ai) 回复它没有正确的答案

    我在用Wit ai对于我的聊天机器人 问题是我的机器人总是试图回答一些问题 只有当我的机器人真正理解所问的内容时 我才会做出回答 我知道这是可能的 但如果我有一个回复很少的机器人 它似乎总是选择其中一个回复 即使它被问到完全不同的问题 我想
  • 连接到 docker-compose mysql 容器拒绝访问,但运行相同映像的 docker 不会

    我在连接到使用 docker compose 启动的 mysql docker 容器时遇到一些问题 这是一篇很长的文章 抱歉 这是我的 docker compose yml 文件 db image mysql 5 7 ports 3306
  • 为什么静态链接的可执行文件中有全局偏移表和过程链接表?

    我已经阅读了大量有关动态链接器重定位和位置无关代码的内容 包括过程链接表和全局偏移表 我不明白为什么静态链接的可执行文件需要 PLT 和 GOT 我在 ubuntu x86 64 机器上编译了一个 hello world 程序 当我转储节标
  • 在 Linux Mint 上安装 pyttsx3

    我成功安装了 pyttsx3pip install pyttsx3我写了以下代码 import pyttsx3 def speak text engine pyttsx3 init engine say text engine runAnd
  • 如何避免 GUI 控件和域对象之间的并行继承层次结构

    我正在用 C 开发 Windows 窗体应用程序 我正在使用 MVP 设计模式 在 GUI 中 用户可以操作打印机对象 并且需要有自定义控件来向用户表示打印机对象 有一个代表打印机的类层次结构 底层有一个抽象 Printer 类 然后是一个
  • 为 iOS 5.0 编译时,什么会导致“未找到符号:_objc_setProperty_atomic”错误?

    我在 IOS 5 中遇到编译错误 我得到的错误是 wait fences failed to receive reply 10004003 dyld lazy symbol binding failed Symbol not found o
  • 我可以为 dapper-dot-net 映射指定数据库列名称吗?

    dapper dot net 有没有办法使用属性来指定应该使用的列名称而不是属性名称 public class Code public int Id get set public string Type get set This is ca
  • mulx 的 AT&T / GAS 语法是什么? [复制]

    这个问题在这里已经有答案了 The 维基教科书 x86 汇编 https en wikibooks org wiki X86 Assembly GAS Syntax says GAS指令一般具有助记符源 目的地的形式 例如 以下 mov 指
  • 如何将 4.3 舍入为 4.5

    给定一个小数点后一位的值 如何将该小数点四舍五入到半步 如果我有一个值 比如说 4 3 我如何在 PHP 中将其舍入为4 5 其他例子是 3 8 gt gt 4 0 2 1 gt gt 2 5 0 9 gt gt 1 0 另外我应该提到我正
  • dockerizing Nodejs 应用程序 - 当我第一次启动容器时 pm2 ls 应该工作吗

    我有以下快递 节点应用程序 FROM node 12 WORKDIR usr share jtapp COPY package json RUN apt get update RUN apt get install y net tools