Docker端口转发为nodejs应用程序
我在为我的nodejs应用程序configurationdocker时遇到问题。
我以前已经为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
暂停Dockerfile
docker-compose
在Dockerfile
映像构build阶段的执行,因为RUN npm start
是一个启动并监听直到停止的进程(因为您希望它启动节点应用程序并侦听连接),从而导致docker-compose
永远不会完成docker图像创build步骤,更不用说创build所需容器等其他步骤,并完成整个docker-compose
运行时stream程。
简而言之:
当你使用RUN
它意味着运行一个命令做一些工作,并返回某个时间来继续构build过程,它应该返回并退出代码0,并且该过程将移动到下一个Dockerfile
节,或者返回另一个退出代码,并返回构build过程将失败并出现错误。
当你使用CMD
你告诉docker镜像,从这个镜像启动的所有容器的启动命令是什么(它也可以在运行时用docker run
来重写)。 它与ENTRYPOINT
节紧密相关,但对于基本的用法,使用默认值是安全的。
进一步阅读: ENTRYPOINT
, CMD
和RUN