在Docker容器中的Node.js/Express应用程序中,Console.log无法工作

7
我已经在Docker容器中使用以下Dockerfile构建了一个Node.js应用程序:
FROM node:carbon

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

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

我尝试在express路由中使用console.log,但是在执行docker run -p 49160:8080 -d后,控制台不可交互且日志完全没有被记录。

'use strict';

// Requires
const express = require('express');

// Constants
const PORT = 8080;
const HOST = '0.0.0.0';

// App
const app = express();

// Routes
app.get('/', (req, res) => {
    // This isn't being printed anywhere
    console.log(req);
});

// Start
app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

我到底做错了什么?
2个回答

7
从运行容器的命令中删除-d参数:
docker run -p 49160:8080

-d选项在后台运行容器,因此您将无法在控制台中查看其输出。

如果您想让容器在后台运行并想要访问该容器的shell,则可以在容器启动后运行以下命令:

docker exec -it <container-name> bash

新手问题:为什么如果docker被分离,它就无法工作?我认为JavaScript代码(包括console.log)在浏览器本地执行,而不是在docker内部执行。 - CGFoX
2
并非所有的JavaScript都在浏览器这样的相同运行时环境中执行。在这种情况下,有JavaScript在Node运行时环境中运行,这是一种服务器端技术。用于构建此容器的Docker镜像已安装了Node,并且CMD命令使用Node在容器中运行JavaScript代码。 - walkerrandophsmith

3

1
命令 docker logs 用于查看容器写入标准输出的日志,但这是问题的主要矛盾所在。 - Hector Vido

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接