NodeJS Express Docker实例退出,代码为0

目标

我在我的dockercompose.yml有3个实例,我只能启动2个实例,并且难以启动我的节点expression的第三个实例。


项目目录

 . ├── Icon\r ├── angular │  ├── Dockerfile │  ├── README.md │  ├── dist │  │  ├── css │  │  │  └── style.css │  │  ├── img │  │  │  ├── external.png │  │  │  ├── favicon.png │  │  │  ├── footer_logo.png │  │  │  └── logo.png │  │  ├── index.html │  │  └── js │  │  ├── bundle.js │  │  └── vendor.js │  ├── docs │  │  ├── app │  │  │  ├── api.js │  │  │  ├── app.config.js │  │  │  ├── app.module.js │  │  │  └── guide.js │  │  ├── build │  │  │  ├── index.html │  │  │  ├── partials │  │  │  │  ├── api │  │  │  │  │  ├── common │  │  │  │  │  │  ├── directive │  │  │  │  │  │  │  └── app.html │  │  │  │  │  │  ├── directive.html │  │  │  │  │  │  ├── type │  │  │  │  │  │  │  ├── AppController.html │  │  │  │  │  │  │  └── AppSidebarController.html │  │  │  │  │  │  └── type.html │  │  │  │  │  ├── common.html │  │  │  │  │  ├── components.auth │  │  │  │  │  │  ├── service │  │  │  │  │  │  │  └── AuthService.html │  │  │  │  │  │  └── service.html │  │  │  │  │  ├── components.auth.html │  │  │  │  │  ├── components.contact │  │  │  │  │  │  ├── directive │  │  │  │  │  │  │  └── lengthCheck.html │  │  │  │  │  │  ├── directive.html │  │  │  │  │  │  ├── service │  │  │  │  │  │  │  └── ContactService.html │  │  │  │  │  │  ├── service.html │  │  │  │  │  │  ├── type │  │  │  │  │  │  │  └── ContactEditController.html │  │  │  │  │  │  └── type.html │  │  │  │  │  ├── components.contact.html │  │  │  │  │  └── components.html │  │  │  │  ├── api.html │  │  │  │  ├── guide │  │  │  │  │  └── howTo.html │  │  │  │  └── guide.html │  │  │  └── src │  │  │  ├── api-data.js │  │  │  ├── api.js │  │  │  ├── app.config.js │  │  │  ├── app.module.js │  │  │  ├── guide-data.js │  │  │  └── guide.js │  │  ├── config │  │  │  ├── index.js │  │  │  ├── processors │  │  │  │  ├── api-data.js │  │  │  │  ├── guide-data.js │  │  │  │  └── index-page.js │  │  │  └── templates │  │  │  ├── constant-data.template.js │  │  │  ├── content.template.html │  │  │  ├── indexPage.template.html │  │  │  └── module.template.html │  │  └── content │  │  ├── api │  │  │  └── index.md │  │  └── guide │  │  ├── howTo.md │  │  └── index.md │  ├── files │  │  ├── default.conf │  │  └── nginx.conf │  ├── gulpfile.babel.js │  ├── karma.conf.js │  ├── mocks │  │  └── firebase.mock.js │  ├── npm-shrinkwrap.json │  ├── package.json │  ├── src │  │  ├── app │  │  │  ├── common │  │  │  │  ├── app-footer.component.js │  │  │  │  ├── app-footer.html │  │  │  │  ├── app-header.component.js │  │  │  │  ├── app-header.html │  │  │  │  ├── app-pagination.html │  │  │  │  ├── app-pagination.js │  │  │  │  ├── app-sidebar.component.js │  │  │  │  ├── app-sidebar.html │  │  │  │  ├── app.component.js │  │  │  │  ├── app.html │  │  │  │  ├── app.module.js │  │  │  │  ├── app.spec.js │  │  │  ├── components │  │  │  │  ├── auth │  │  │  │  │  ├── auth-form │  │  │  │  │  │  ├── auth-form.component.js │  │  │  │  │  │  ├── auth-form.controller.js │  │  │  │  │  │  ├── auth-form.html │  │  │  │  │  │  └── auth-form.spec.js │  │  │  │  │  ├── auth.module.js │  │  │  │  │  ├── auth.spec.js │  │  │  │  │  └── login │  │  │  │  │  ├── login.component.js │  │  │  │  │  ├── login.controller.js │  │  │  │  │  ├── login.html │  │  │  │  │  └── login.spec.js │  │  │  │  ├── components.module.js │  │  │  │  └── dashboard │  │  │  │  ├── access-point-map │  │  │  │  │  ├── access-point-map.component.js │  │  │  │  │  └── access-point-map.html │  │  │  │  ├── account-stats │  │  │  │  │  ├── account-stats.component.js │  │  │  │  │  └── account-stats.html │  │  │  │  ├── dashboard.component.js │  │  │  │  └── dashboard.html │  │  │  ├── root.component.js │  │  │  ├── root.html │  │  │  └── services │  │  │  ├── account.service.js │  │  │  ├── auth.service.js │  │  │  └── services.module.js │  │  ├── img │  │  │  ├── external.png │  │  │  ├── favicon.png │  │  │  ├── footer_logo.png │  │  │  └── logo.png │  │  ├── index.html │  │  └── sass │  │  ├── base │  │  │  ├── _buttons.scss │  │  │  ├── _forms.scss │  │  │  ├── _headings.scss │  │  │  ├── _list-group.scss │  │  │  ├── _main.scss │  │  │  ├── _media.scss │  │  │  ├── _mixins.scss │  │  │  ├── _page-header.scss │  │  │  ├── _scaffolding.scss │  │  │  ├── _sections.scss │  │  │  ├── _table.scss │  │  │  └── _tabset.scss │  │  ├── components │  │  │  ├── _auth.scss │  │  │  ├── _footer.scss │  │  │  ├── _header.scss │  │  │  ├── _panels.scss │  │  │  ├── _root.scss │  │  │  ├── _sidebar.scss │  │  │  └── _tablet.scss │  │  ├── layout │  │  │  ├── _loading.scss │  │  │  └── _smb.scss │  │  ├── style.scss │  │  ├── utils │  │  │  ├── _colors.scss │  │  │  └── _typography.scss │  │  └── vendors │  │  ├── _bootstrap.scss │  │  ├── _colorpicker.scss │  │  ├── _fontawesome.scss │  │  └── _rzslider.scss │  └── templates.js ├── docker-compose.yml └── express ├── Dockerfile ├── LICENSE ├── README.md ├── bin │  └── index.js ├── npm-debug.log ├── npm-shrinkwrap.json ├── package.json └── server ├── app.js ├── config │  └── config.json ├── controllers │  ├── accounts.js │  ├── auth.js │  ├── index.js │  ├── todoitems.js │  └── todos.js ├── migrations │  ├── 20160717103305-create-todo.js │  └── 20160717104733-create-todo-item.js ├── models │  ├── index.js │  ├── todo.js │  └── todoitem.js ├── routes │  └── index.js └── services ├── account.js ├── cpe.js ├── device.js └── index.js 59 directories, 166 files 

后端

Dockerfile

 # Create image based on the official Node 6 image from the dockerhub FROM node:6 RUN useradd --user-group --create-home --shell /bin/false nodejs # Create a directory where our app will be placed RUN mkdir -p /usr/src/app # Change directory so that our commands run inside this new directory WORKDIR /usr/src/app # Copy dependency definitions COPY package.json /usr/src/app # Install dependecies RUN npm install # Get all the code needed to run the app COPY . /usr/src/app # Expose the port the app runs in EXPOSE 3000 # Serve the app CMD ["node", "server/app.js"] 

根据我的文件结构,在上面的这个文件中有没有错误?


前端

Dockerfile

 FROM alpine:3.6 RUN apk add --update nginx && rm -rf /var/cache/apk/* RUN mkdir -p /tmp/nginx/client-body COPY files/nginx.conf /etc/nginx/nginx.conf COPY files/default.conf /etc/nginx/conf.d/default.conf COPY dist /usr/share/nginx/html CMD ["nginx", "-g", "daemon off;"] 

dockercompose.yml

 version: '2.1' # Define the services/containers to be run services: angular: build: angular # specify the directory of the Dockerfile network_mode: bridge ports: - 8080:80/tcp volumes: - /Users/bheng/Sites/BASE/angular/dist:/usr/share/nginx/html:rw express: #name of the second service build: express # specify the directory of the Dockerfile ports: - "3000:3000" #specify ports forewarding mem_limit: 300m memswap_limit: 1g volumes: - .:/home/nodejs/app - /home/nodejs/app/node_modules links: - database database: # name of the third service image: postgres environment: POSTGRES_PASSWORD: ih4cku ports: - "5432:5432" # specify port forewarding 

结果

我无法启动我的第三个实例。

我一直在得到

 docker-compose up Starting base_angular_1 ... Starting base_database_1 ... Starting base_database_1 Starting base_database_1 ... done Starting base_express_1 ... Starting base_express_1 ... done Attaching to base_angular_1, base_database_1, base_express_1 database_1 | LOG: database system was shut down at 2017-08-30 00:54:24 UTC database_1 | LOG: MultiXact member wraparound protections are now enabled database_1 | LOG: database system is ready to accept connections database_1 | LOG: autovacuum launcher started 

base_express_1用代码0退出

如何进一步debugging呢?

好的,在你发布你的app.js ,我想我可以帮你。

当您运行节点app.js时,该app.js正在执行并成功退出,因为它只是一个模块,但没有服务器正在启动。

你需要这样一个文件:

创build一个bin文件夹,在里面创build一个文件,命名这个文件www名字只是build议,你可以任意命名。

 #!/usr/bin/env node /** * Load any undefined ENV variables */ require('dotenv').config(); /** * Module dependencies. */ var app = require('../app'); var debug = require('debug')('app:server'); var http = require('http'); /** * Get port from environment and store in Express. */ var port = normalizePort(process.env.PORT || '3000'); app.set('port', port); /** * Create HTTP server. */ var server = http.createServer(app); /** * Listen on provided port, on all network interfaces. */ server.listen(port); server.on('error', onError); server.on('listening', onListening); /** * Normalize a port into a number, string, or false. */ function normalizePort(val) { var port = parseInt(val, 10); if (isNaN(port)) { // named pipe return val; } if (port >= 0) { // port number return port; } return false; } /** * Event listener for HTTP server "error" event. */ function onError(error) { if (error.syscall !== 'listen') { throw error; } var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port; // handle specific listen errors with friendly messages switch (error.code) { case 'EACCES': console.error(bind + ' requires elevated privileges'); process.exit(1); break; case 'EADDRINUSE': console.error(bind + ' is already in use'); process.exit(1); break; default: throw error; } } /** * Event listener for HTTP server "listening" event. */ function onListening() { var addr = server.address(); var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; debug('Listening on ' + bind); } 

然后确保你安装了这些包:

 npm install debug --save npm install dotenv --save 

如果需要,可以从www文件中删除这些文件。 我只是把它们包含在这里,所以我的共享www文件运行。

然后,在快速应用程序的Dockerfile中,使用:

node ./bin/www

这个命令启动一个服务器,使进程保持活动并为你的app.js express模块​​提供服务。 确保您需要在wwwapp.js文件的位置与您的文件的位置相匹配。 我把那里../app在要求。

如何将其包含在DockerFile中?

我推荐这个:在你的package.json创build一个入口:

"start": "node ./bin/www"

scripts部分。

然后,更新你的Dockerfile

CMD npm startCMD ["npm", "start"]