运行 Node 应用程序的 Elastic Beanstalk Docker 容器提前退出

Posted

技术标签:

【中文标题】运行 Node 应用程序的 Elastic Beanstalk Docker 容器提前退出【英文标题】:Elastic Beanstalk Docker container running Node application exits early 【发布时间】:2017-11-07 23:52:57 【问题描述】:

我有一个带有 docker 的 ElasticBeanstalk 环境,它部署了一个运行 restify 的节点应用程序。当我们部署新版本的应用程序时,我们会看到间歇性故障并出现以下错误:

Command failed on instance. Return code: 1 Output: nginx: [emerg] no host in upstream ":8080"

查看日志时,我们看到容器以exit 0 退出,这意味着应用程序正在返回它已成功退出。

Dockerfile:

FROM node:alpine
RUN mkdir -p /usr/src/app 
WORKDIR /usr/src/app

COPY .npmrc .npmrc   
COPY package.json /usr/src/app/ 
RUN npm install 
RUN rm -f .npmrc

COPY . /usr/src/app

EXPOSE 8080 CMD ["npm", "start"]

【问题讨论】:

【参考方案1】:

TL;DR:CMD 应该启动长时间运行的进程。

CMD npm start 将通过一个 gulp 任务启动应用程序,该任务产生一个进程来启动节点应用程序服务器。

一旦产生了应用程序进程,gulp 任务就会完成。一旦 gulp 完成,该进程将向 docker 报告它已成功完成,因此容器将退出。为了解决这个问题,我将 docker 文件 CMD 更改为:

CMD ["npm", "run", "start-node"]

start-node 运行命令node dist/app.js

所以现在由 CMD 启动的进程是应用程序服务器,而不是产生将启动应用程序的子进程的进程。

【讨论】:

以上是关于运行 Node 应用程序的 Elastic Beanstalk Docker 容器提前退出的主要内容,如果未能解决你的问题,请参考以下文章

以 root 身份运行 Node.js 脚本的 Elastic beanstalk

Elastic Beanstalk 问题:运行我的 Node.js Express 服务器时连接超时

如何在 Elastic Beanstalk 实例上运行任意 npm 脚本

Node.js 和 Docker - Elastic Beanstalk 502 错误网关

运行 cron 作业 (Node.js) 时如何在 Amazon Elastic Beanstalk 中设置环境变量?

Elastic:如何在一个机器上同时模拟多个node