我是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
代替RUN
和RUN
而不是CMD
,那么docker build
BUILD语句和docker run
RUN语句都会被使用,这对新用户可能会造成混淆。噢,很好。)
您或者想将前两个CMD
s转换为RUN
s(如果您希望它们在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更改时,才需要进行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] 删除。
我来说两句