加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 03:31:10 所属栏目:安全 来源:网络整理
导读:我是码头工人并且很喜欢玩它.我想在docker容器中运行nodejs app.我把ubuntu:14.04作为基本图像并构建我自己的nodeJS烘焙图像.我的Dockerfile内容如下所示 FROM ubuntu:14.04MAINTAINER nmrony#install packages,nodejs and npmRUN apt-get -y update apt-

我是码头工人并且很喜欢玩它.我想在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镜像,您可以将某人与您的服务器一起提供给您,因为您的代码位于图像之外的卷上.

很多选择!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读