当我运行docker run -p 8080:3000 --name cabinfeverInstance -t something/cabinfever
时,我会被放入Node.js的REPL中,当我希望看到"监听端口:3000";。转到localhost:8000会导致";没有发送任何数据。ERR_EMPTY_REPONSE";。我没有发现其他发生这种情况的例子(也许我没有在谷歌上搜索正确的单词/棘手的短语(。我确实发现这个问题似乎有些关联。他们的解决方案是";使容器化的应用程序期望来自windows主机IP(而不是容器IP(的请求";,但我不知道该如何实施。此外,他们的解决方案也不可能是我的解决方案。
我尝试过的:
- 清理/清除数据
- 运行
docker run -p 8080:3000/tcp -p 8080:3000/udp --name cabinfeverInstance -t something/cabinfever
- 未指定特定端口(8080(
- 指定0.0.0.0
- 其他几个想法
没有一个工作,我仍然得到了精彩的节点REPL。
如果有人有任何建议,我将不胜感激。
以下是相关文件:
index.js
var express = require('express');
var app = express();
var port = 3000;
app.get('/', function(req,res) {
console.log(new Date().toLocaleString());
res.send(new Date().toLocaleString());
});
app.listen(port, () => {
console.log(`Listening at http://localhost: ${port}`);
});
package.json:
{
"name": "docnode",
"version": "1.0.0",
"description": "barebones node on docker",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1",
"start": "index.js"
},
"author": "my.email.address@gmail.com",
"license": "MIT",
"dependencies": {
"express": "^4.15.5"
}
}
docker-compose.yml:
version: "3"
services:
node:
build: .
command: node index.js
ports:
- "3000:3000"
Dockerfile:
FROM node:slim
LABEL author="my.email.address@gmail.com"
WORKDIR /app
# copy code, install npm dependencies
COPY index.js /app/index.js
COPY package.json /app/package.json
RUN npm install
您应该指定在Dockerfile中运行的命令,而不是docker-compose.yml
文件:
CMD ["node", "index.js"]
当docker run
图像时,它只考虑docker run
命令行上的选项。docker run
不知道docker-compose.yml
,所以如果你在那里指定了command:
之类的东西,它就不会被尊重。由于CMD
不在Dockerfile中,也不在docker run
命令行上(在映像名称之后(,因此可以返回到基本映像的CMD
,在node
的情况下,它将运行REPL。
通过此更改,您不需要覆盖docker-compose.yml
文件中的command:
,并且可以删除该行。运行
docker-compose up -d
将使用指定的选项启动docker-compose.yml
文件中的容器(注意,ports:
映射和docker run -p
端口略有不同(。