我在为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以遵循答案。
答案 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
节紧密相关,但对于基本用法,您可以使用默认值。
进一步阅读:ENTRYPOINT
,CMD
和RUN