无法将nodeapp停靠

时间:2017-05-10 12:08:05

标签: javascript node.js docker

按以下方式创建了泊坞窗文件:

FROM node:boron

ADD package.json package.json

RUN npm install
ADD . .

EXPOSE 4500

CMD ["node","main.js"]

构建应用

docker build -t“appname”

运行应用

docker run -it“appname”

main.js内,我有:

var express = require("express");
var app = express();
var path = require('path');
var http = require('http');
var https = require('https');
var nodemailer = require('nodemailer');
var bodyParser = require('body-parser');
var request = require("request");

var port = process.env.PORT || 3001;
app.set('port', (port));
app.listen(app.get('port'), function () {
    console.log('Node app is running on port', app.get('port'));
});

//app.use('/', express.static(path.join(__dirname, '/public_html')))
app.use('/', express.static(__dirname + '/public_html'));
app.use(bodyParser.json({limit: '5mb'}));
app.use(bodyParser.urlencoded({
    limit: '5mb',
    extended: false
}));


app.get('/', function(request, response) {
  response.render('public_html/');
});

//app.get('/', function (req, res, next) {
//    res.sendFile('/index.html');
//});

app.use('*', function (req, res, err) {
//    console.log('error:  ', err);
});

当我使用docker命令'docker run -it“appname”`运行应用程序时,我得到了控制台:

Node app is running on port 3001

但是当我浏览时,页面为空或浏览器/输出/视图中未加载任何内容。它应该从index.html

中选择response.render('public_html/');

1 个答案:

答案 0 :(得分:4)

您需要明确公开应用程序应运行的端口:

docker run -p 3001:3001 your-node-image

然后,您可以在http://localhost:3001下的docker主机上访问容器的服务,因为-p 3001:3001将主机端口3001(参数中的第一个3001)绑定到容器' s端口3001(第二个3001)。

来自Dockerfile的

EXPOSE仅描述了应用程序公开的端口(位于Dockerfile 4500和程序端口3001中......?为什么它们不同?)。使用-p发布端口也是访问容器see the docs

所必需的
  

EXPOSE指令通知Docker容器在运行时侦听指定的网络端口。 EXPOSE不会使容器的端口可供主机访问。为此,您必须使用-p标志发布一系列端口,或使用-P标志发布所有公开的端口。

此外,标记-it似乎对您的服务无效。当您想要进行交互式会话时需要这些标志,例如当你在容器中启动shell时。

请在此处查看有关端口曝光in the official documentation

的更多信息