【问题标题】:Docker port forwarding for nodejs appnodejs 应用程序的 Docker 端口转发
【发布时间】:2017-10-27 11:26:32
【问题描述】:

我在为我的 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 inspect 是否有用,但如果有,请告诉我,我也会发布它。

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

【问题讨论】:

  • 如果你运行 docker logs -f a60f9c82d600 那个容器的日志是什么?你也检查过端口是否打开并且没有其他东西在监听它吗?
  • @Sergiu:我得到以下信息:Error response from daemon: configured logging driver does not support reading
  • 那是你的问题 :) 容器没有正常运行,因为你的日志。我会从那里开始调试
  • romantic_albattani 是一个随机名称。 Docker compose 不使用随机名称。确保您的撰写容器没有退出。如果你不需要它,就杀掉那些浪漫的东西。
  • @Sergiu 没问题。他正在使用不同的日志记录驱动程序

标签: node.js docker docker-compose dockerfile


【解决方案1】:

您的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 这是一个启动和侦听直到停止的进程(因为您希望它启动您的节点应用程序并侦听连接) 导致 docker-compose 永远无法完成 docker 映像创建步骤,更不用说创建所需容器和完成整个 docker-compose 运行时过程等其他步骤了。

简而言之:

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

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

延伸阅读:ENTRYPOINTCMDRUN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2015-02-24
    • 2023-03-22
    • 2012-03-07
    • 1970-01-01
    • 2015-03-29
    • 2015-01-15
    相关资源
    最近更新 更多