nodejs app的Docker端口转发

时间:2017-10-27 11:26:33

标签: node.js docker docker-compose dockerfile

我在为nodejs app配置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

此时有任何帮助表示赞赏。

我不知道码头检查是否有用,但如果有,请告诉我,我也会发布。

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

1 个答案:

答案 0 :(得分:3)

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

简而言之:

当你使用docker-compose时,它意味着运行一个命令做一些工作并返回某个时间继续构建过程,它应该返回并退出0代码,然后该过程将继续进行下一个{{1 stanza,或返回另一个退出代码,构建过程将失败并显示错误。

当您使用RUN时,您告诉泊坞窗图像从此图像开始的所有容器的起始命令是什么(它也可以在运行时使用Dockerfile覆盖)。它与CMD节紧密相关,但对于基本用法,您可以使用默认值。

进一步阅读:ENTRYPOINTCMDRUN