我在为我的 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
, CMD
和 RUN
关于node.js - Nodejs 应用程序的 Docker 端口转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46973944/