为什么NPM在Docker容器中不可用

只是罗尼

我是docker的新手,并且正在玩它。我正在尝试在docker容器中运行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 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.<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)

我使用交互式外壳程序运行另一个容器,发现未安装npm。有人可以帮我为什么容器上未安装NPM吗?难道我做错了什么?

米卡洛特

您的根本问题是Docker文件中只能有一个 CMD每个RUN/COPY命令在期间都会建立一层docker build,因此您可以根据需要拥有任意数量的命令但是,恰恰 CMD在期间执行了一个docker run由于您有3条CMD语句,因此实际上只有一条语句被执行(大概是最后一条)。

(IMO,如果Dockerfile团队选择单词BUILD代替RUNRUN而不是CMD,那么docker buildBUILD语句和docker runRUN语句都会被使用,这对新用户可能会造成混淆。噢,很好。)

您或者想将前两个CMDs转换RUNs(如果您希望它们s期间发生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更改时,才需要进行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映像,您可以将其与服务器一起提供给他人,因为您的代码位于该映像的卷之外。

很多选择!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么 Groovy 的日期扩展在 Micronaut 中不可用?

来自分类Dev

为什么隐式类中的函数不可用?

来自分类Python

为什么是Python 3.6.1。pyenv中不可用?

来自分类Dev

为什么 SparkSession 在 Spark2.3 中不可用

来自分类Dev

为什么别名在 /etc/profile 中不可用?

来自分类Dev

为什么原型在简单的JavaScript对象中不可用

来自分类Dev

为什么无符号整数在PostgreSQL中不可用?

来自分类Java

为什么@HeadMapping在Spring MVC中不可用?

来自分类Dev

为什么以及何时malloc()在C中不可用?

来自分类Dev

为什么“共享按钮”在Ubuntu One中不可用?

来自分类Dev

为什么在此示例中变量范围不可用

来自分类Dev

为什么 vundle 在 apt 中不可用?

来自分类Dev

导入的动作在容器中不可用

来自分类Dev

Docker容器在浏览器中可用,但在curl中不可用

来自分类Dev

为什么变量不可用?

来自分类Dev

为什么线程2不可用?

来自分类Dev

为什么“事件”在Chrome中全局可用,但在FF中不可用?

来自分类Dev

Windows Docker工具箱中的localhost上的容器不可用

来自分类Dev

图像/css/js 文件在 docker 容器上不可用

来自分类Dev

Azure应用服务Docker容器``服务不可用''

来自分类Dev

Docker 容器不在 windows 上运行,端口不可用

来自分类Dev

Symfony5 / Codeception:服务在容器中不可用

来自分类Java

为什么我从Tomcat 7中收到404请求的资源不可用错误

来自分类Dev

为什么我得到的错误模块在JSFiddle中不可用?

来自分类Dev

为什么字体在 ASP.NET 代码中不可用?

来自分类Dev

为什么我已经定义了AngularJS中的“模块'myControllers'不可用”?

来自分类Dev

为什么`this`在C#6.0自动属性初始化中不可用?

来自分类Dev

为什么“repo”包在 Ubuntu 20.04 中不可用?我该如何安装?

来自分类Dev

为什么使用* ngIf时模板局部变量在模板中不可用?

Related 相关文章

  1. 1

    为什么 Groovy 的日期扩展在 Micronaut 中不可用?

  2. 2

    为什么隐式类中的函数不可用?

  3. 3

    为什么是Python 3.6.1。pyenv中不可用?

  4. 4

    为什么 SparkSession 在 Spark2.3 中不可用

  5. 5

    为什么别名在 /etc/profile 中不可用?

  6. 6

    为什么原型在简单的JavaScript对象中不可用

  7. 7

    为什么无符号整数在PostgreSQL中不可用?

  8. 8

    为什么@HeadMapping在Spring MVC中不可用?

  9. 9

    为什么以及何时malloc()在C中不可用?

  10. 10

    为什么“共享按钮”在Ubuntu One中不可用?

  11. 11

    为什么在此示例中变量范围不可用

  12. 12

    为什么 vundle 在 apt 中不可用?

  13. 13

    导入的动作在容器中不可用

  14. 14

    Docker容器在浏览器中可用,但在curl中不可用

  15. 15

    为什么变量不可用?

  16. 16

    为什么线程2不可用?

  17. 17

    为什么“事件”在Chrome中全局可用,但在FF中不可用?

  18. 18

    Windows Docker工具箱中的localhost上的容器不可用

  19. 19

    图像/css/js 文件在 docker 容器上不可用

  20. 20

    Azure应用服务Docker容器``服务不可用''

  21. 21

    Docker 容器不在 windows 上运行,端口不可用

  22. 22

    Symfony5 / Codeception:服务在容器中不可用

  23. 23

    为什么我从Tomcat 7中收到404请求的资源不可用错误

  24. 24

    为什么我得到的错误模块在JSFiddle中不可用?

  25. 25

    为什么字体在 ASP.NET 代码中不可用?

  26. 26

    为什么我已经定义了AngularJS中的“模块'myControllers'不可用”?

  27. 27

    为什么`this`在C#6.0自动属性初始化中不可用?

  28. 28

    为什么“repo”包在 Ubuntu 20.04 中不可用?我该如何安装?

  29. 29

    为什么使用* ngIf时模板局部变量在模板中不可用?

热门标签

归档