node.js - Nodejs 应用程序的 Docker 端口转发

标签 node.js docker docker-compose dockerfile

我在为我的 Nodejs 应用程序配置 docker 时遇到问题。

我之前已经为 php 和 Rails 设置了容器,端口转发工作完美,但对于这个例子,我似乎无法让它工作。

运行:docker ps,我得到以下信息:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
a60f9c82d600        29c7d94a8c58        "/bin/sh -c 'npm s..."   5 seconds ago       Up 3 seconds        3000/tcp            romantic_albattani

如您所见,我没有得到我所期望的通常的:0.0.0.0:3000->3000/tcp

docker-compose ps 给出:

Name   Command   State   Ports
------------------------------

我的 docker-compose.yml:

web:
  build: .
  volumes:
    - .:/app
  volumes_from:
    - box
  ports:
    - "3000:3000"

box:
  image: busybox
  volumes:
    - /node_modules

我的 Docker 文件:

FROM node:8.7.0

# The base node image sets a very verbose log level.
ENV NPM_CONFIG_LOGLEVEL warn

WORKDIR /tmp
COPY package.json /tmp/
RUN npm install

WORKDIR /app
ADD . /app
RUN cp -a /tmp/node_modules /app/

#ENV PORT=3000
EXPOSE 3000
CMD npm start

我正在运行命令:docker-compose up --build

此时如有任何帮助,我们将不胜感激。

我不知道 docker 检查是否有用,但如果有的话,请告诉我,我也会发布它。

编辑:更改了我的 Dockerfile 以遵循答案。

最佳答案

您的 docker-compose.yml 文件格式错误,因为您没有收到任何错误,我假设您将其粘贴到此处是错误的,这是具有固定缩进的版本:

web:
  build: .
  volumes:
    - .:/app
  volumes_from:
    - box
  ports:
    - "3000:3000"

box:
  image: busybox
  volumes:
    - /node_modules

您的 Dockerfile 有错误,您缺少 ENTRYPOINT 和/或 CMD 节,而是使用 RUN 节意图错误,这里是一个已应用修复的工作 Dockerfile:

FROM node:8.7.0

# The base node image sets a very verbose log level.
ENV NPM_CONFIG_LOGLEVEL warn

WORKDIR /tmp
COPY package.json /tmp/
RUN npm install

WORKDIR /app
ADD . /app
RUN cp -a /tmp/node_modules /app/

#ENV PORT=3000
EXPOSE 3000
CMD npm start

您的Dockerfile在docker镜像构建阶段停止了docker-compose的执行,因为RUN npm start是一个进程,启动并监听直到停止(因为您希望它启动 Node 应用程序并监听连接)导致 docker-compose 永远无法完成 docker 镜像创建步骤,更不用说创建所需容器等其他步骤并完成整个docker-compose运行时过程。

简而言之:

当您使用RUN时,它意味着运行一个命令做一些工作并在某个时候返回以继续构建过程,它应该返回并退出代码0,并且该过程将继续到下一个Dockerfile 节,或者返回另一个退出代码,构建过程将失败并出现错误。

当你使用CMD时,你告诉docker镜像从此镜像启动的所有容器的启动命令是什么(也可以在运行时使用docker run覆盖它) >)。它与 ENTRYPOINT 节紧密相关,但对于基本用法,使用默认值是安全的。

进一步阅读:ENTRYPOINT , CMDRUN

关于node.js - Nodejs 应用程序的 Docker 端口转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46973944/

相关文章:

python - FastAPI 如何修复错误遍历文件系统 : OSError [Errno 40] Too many levels of symbolic links: '/sys/class/vtconsole/vtcon0/subsystem?

docker - 如何修复 Kafka Docker 容器抛出 0.0.0.0/0.0.0.0 :2181: Connection refused?

docker - 无根 docker-compose 无法构建时间刻度图像

Docker 构建在入口点的 COPY 或 ADD 语句上失败,仅限 Windows

javascript - Twilio 座席 session 外拨通话录音

node.js - 在 Windows 上使用 pm2 时如何传递 Node 参数

javascript - 如何将用户转移到另一个 channel ?

node.js - 如何更改/输入 Passport.js 'username' 和 'password' 之外的不同属性

linux - Jenkins docker 缺少一些二进制文件

asp.net - 使用MsDeploy在Docker上发布ASP.Net网站