node.js – 为什么在Docker Conainter中没有NPM

前端之家收集整理的这篇文章主要介绍了node.js – 为什么在Docker Conainter中没有NPM前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我是码头工人并且很喜欢玩它.我想在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没有安装在容器上?难道我做错了什么?

最佳答案
您的根本问题是您只能在Docker文件中只有一个CMD.每个RUN / COPY命令在docker build期间构建一个图层,因此您可以根据需要添加任意数量的图层.但是,在docker运行期间只执行一个CMD.由于你有三个CMD语句,实际上只有一个被执行(大概是最后一个).

(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镜像,您可以将某人与您的服务器一起提供给您,因为您的代码位于图像之外的卷上.

很多选择!

猜你在找的Docker相关文章