为什么NPM是不是在泊坞集装箱可用
我很新的泊坞窗,并用它玩。我试图运行搬运工容器应用的NodeJS。我把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 | 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.<anonymous> (/src/server.js:1:77)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
我运行交互shell另一个容器,发现NPM未安装。有人能帮助我,为什么在容器未安装NPM?难道我做错了什么?
回答如下:你的根本问题是,你只能有一个确切的CMD
在泊坞文件。每个RUN
/ COPY
命令docker build
期间建立了一个层,所以,只要你想,你可以有很多的那些。然而,正是一个CMD
获取docker run
期间执行。既然你有三个CMD
语句,其中只有真正得到执行(据推测,最后一个)之一。
(IMO,如果Dockerfile队会选择这个词BUILD
代替RUN
和RUN
代替CMD
,使docker build
不BUILD报表和docker run
不运行的语句,这可能是对新用户减少混乱。哦,好。)
要么你想你的前两个CMD
s转换为RUN
s(如果你希望他们到docker build
期间发生,烤成图像),或者是把所有三个CMD
s在你运行一个脚本。下面的几个解决方案:
(1)最简单的变化可能是改用WORKDIR
cd
的,让你的npm install
一个RUN
命令。如果你想使你的服务器启动时,能够建设过程中npm install
很快,当你跑,你想做的事:
#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变化。否则,你的形象变化每次什么东西,你重建一切。
(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
当然,最后的选择不给你一个便携式泊坞窗的图像,你可以给别人使用你的服务器,因为你的代码是在图像之外,在卷上。
很多的选择!