最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

为什么NPM是不是在泊坞集装箱可用

运维笔记admin16浏览0评论

为什么NPM是不是在泊坞集装箱可用

为什么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代替RUNRUN代替CMD,使docker build不BUILD报表和docker run不运行的语句,这可能是对新用户减少混乱。哦,好。)

要么你想你的前两个CMDs转换为RUNs(如果你希望他们到docker build期间发生,烤成图像),或者是把所有三个CMDs在你运行一个脚本。下面的几个解决方案:

(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

当然,最后的选择不给你一个便携式泊坞窗的图像,你可以给别人使用你的服务器,因为你的代码是在图像之外,在卷上。

很多的选择!

发布评论

评论列表(0)

  1. 暂无评论