【问题标题】:node.js + pm2 -- Configuring node_args depending on environmentnode.js + pm2 -- 根据环境配置 node_args
【发布时间】:2017-12-02 16:19:33
【问题描述】:

下面是一个非常简单的process.json 使用pm2 启动js 应用程序。

我的目标是启动下面的node_args 流程,但仅限于非产品发布。因此,例如,如果某个环境变量以某种方式设置,则触发 node_args,否则忽略它们。

这可能吗?如果没有,我能做些什么解决方法?

{
  apps : [
    {
      name      : 'API',
      script    : './app.js',
      node_args: ["--inspect","--debug=0.0.0.0:7000"],
      env: {
        NODE_ENV: 'development'
      }
    }
  ]
}

我知道可以在命令行中抛出 node_args,但目标是在 docker 中运行它,其中“运行”命令对于源图像是静态的,因此这并不可行。

这是我的 Dockerfile 中的 CMD 条目:

CMD [ "pm2-docker", "--auto-exit", "--watch", "process.json"]

【问题讨论】:

    标签: javascript node.js docker pm2


    【解决方案1】:

    您可以定义同一个应用的多个声明,具体取决于其环境设置。

    在您的情况下,您的流程文件定义可以如下:

    process.json

    {
      apps : [
        {
          name      : 'API-DEV',
          script    : './app.js',
          node_args: ["--inspect","--debug=0.0.0.0:7000"],
          env: {
            NODE_ENV: 'development'
          }
        },
        {
          name      : 'API-PROD',
          script    : './app.js',
          env: {
            NODE_ENV: 'production'
          }
        }
      ]
    }
    

    那么,如果你想运行development版本的应用,DockerfileCMD条目将是

    CMD [ "pm2-docker", "start", "process.json", "--only", "API-DEV", "--auto-exit", "--watch" ] 
    

    如果您不喜欢重复,您可以使用.config.js 文件而不是json 并像这样定义您的配置

    process.config.js

    const appDefs = [
      {
        "suffix": "prod",
        "node_args": [],
        "env": {
          "NODE_ENV": "production"
        }
      },
      {
        "suffix": "dev",
        "node_args": ["--inspect","--debug=0.0.0.0:7000"],
        "env": {
          "NODE_ENV": "development"
        }
      }
    ];
    
    module.exports = {
      "apps": appDefs.map(appDef => ({
        "name": `API-${appDef.suffix}`,
        "script": "./app.js",
        "node_args": appDef.node_args,
        "env": appDef.env
      }))
    };
    

    然后,CMD 条目将是

    CMD [ "pm2-docker", "start", "process.config.js", "--only", "API-DEV", "--auto-exit", "--watch" ] 
    

    【讨论】:

    • 谢谢。因此,由于CMD 条目不同,我似乎需要单独的图像?拥有相同的源图像会很好,然后在启动容器时可以设置环境 - 这可能吗?
    • 我不是 docker 专家,但我的理解是,您希望在执行 docker run 命令时将不同的值传递给您的 CMD 条目。在那种情况下,我认为this 会解决问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    相关资源
    最近更新 更多