我是码头工人并且很喜欢玩它.我想在docker容器中运行nodejs app.我把ubuntu:14.04作为基本图像并构建我自己的nodeJS烘焙图像.我的Dockerfile内容如下所示
FROM ubuntu:14.04
MAINTAINER nmrony
#install packages,nodejs and npm
RUN apt-get -y update && \
apt-get -y install build-essential && \
curl -sL https://deb.nodesource.com/setup | bash - && \
apt-get install -y nodejs
#Copy the sources to Container
COPY ./src /src
CMD ["cd /src"]
CMD ["npm install"]
CMD ["nodejs","/src/server.js"]
我使用以下命令运行容器
docker run -p 8080:8080 -d --name nodejs_expreriments nmrony/exp-nodejs
它运行正常.但是当我尝试浏览http:localhost:8080时它不会运行.
当我运行docker logs nodejs_expreriments时,我收到以下错误
Error: Cannot find module 'express'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.
我用交互式shell运行另一个容器,发现没有安装npm.有人可以帮助我为什么NPM没有安装在容器上?难道我做错了什么?
(IMO,如果Dockerfile团队选择了BUILD而不是RUN和RUN而不是CMD,那么docker build会对BUILD语句和docker run执行RUN语句,这可能会让新用户感到困惑.哦,好吧. )
您要么将前两个CMD转换为RUN(如果您希望它们在docker构建期间发生并被烘焙到图像中),要么将所有三个CMD放在您运行的脚本中.这里有一些解决方案:
(1)最简单的改变可能是使用WORKDIR而不是cd并使你的npm安装一个RUN命令.如果您希望能够在构建期间进行npm安装,以便在运行时快速启动服务器,那么您需要执行以下操作:
#Copy the sources to Container
COPY ./src /src
WORKDIR /src
RUN npm install
CMD nodejs server.js
(2)如果你正在积极开发,你可能想要考虑如下:
#Copy the sources to Container
WORKDIR /src
COPY ./src/package.json /src/package.json
RUN npm install
COPY /src /src
CMD nodejs server.js
因此,如果package.json发生更改,您只需要执行npm安装.否则,每当图像中的任何内容发生变化时,您都会重建所有内容.
(3)如果你经常更改包文件并且不想一直打扰构建和运行,那么另一个选项是有用的,那就是将源保留在卷上的图像之外,这样你就可以运行了没有重建:
...
WORKDIR /src
VOLUME /src
CMD build_and_serve.sh
build_and_serve.sh的内容是:
#!/bin/bash
npm install && nodejs server.js
你运行它像:
docker run -v /path/to/your/src:/src -p 8080:8080 -d --name nodejs_expreriments nmrony/exp-nodejs
当然,最后一个选项不会为您提供便携式docker镜像,您可以将某人与您的服务器一起提供给您,因为您的代码位于图像之外的卷上.
很多选择!