运行 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 错误网关