我的docker随笔16:构建一个特定的nodejs镜像
一、背景
某网友需要对区块链交易的项目进行测试。测试脚本需要在nodejs环境中运行,脚本有server.js
、package.json
,主要依赖包为web3
(当然还是其它的)。为方便测试,较好的解决方案是利用docker搭建环境。本文在ubuntu 16.04上进行实验。
二、尝试
docker上已经有了nodejs
官方容器,最新版本为10.5.0。直接使用命令:
docker pull node:alpine
即可拉取镜像,备用。注:为节省镜像体积,使用alpine版本。
创建Dockerfile文件,内容如下:
FROM node:alpine# Create app directory
RUN mkdir -p /home/Service
WORKDIR /home/Service# Bundle app source
COPY . /home/Service
RUN npm installCMD [ "npm", "start" ]
Dockerfile最后一行表示在启动容器时运行npm start命令,该命令会自动找server.js
文件。如是其它名称,则需修改,本文不提。
server.js
和package.json
两文件与Dockerfile同一目录。使用命令
docker build -t mynode .
构建docker镜像。注:其中-t mynode
表示构建后的镜像名称,可用docker images
查看。
然而构建失败,提示信息如下:
Step 5/6 : RUN npm install---> Running in f99a9f66b07d
npm WARN deprecated fs-promise@2.0.3: Use mz or fs-extra^3.0 with Promise Support
npm WARN deprecated tar.gz@1.0.7: ⚠️ WARNING ⚠️ tar.gz module has been deprecated and your application is vulnerable. Please use tar module instead: https://npmjs.com/tar
npm ERR! code ENOGIT
npm ERR! Error while executing:
npm ERR! undefined ls-remote -h -t git://github.com/frozeman/WebSocket-Node.git
npm ERR!
npm ERR! undefined
npm ERR! No git binary found in $PATH
npm ERR!
npm ERR! Failed using git.
npm ERR! Please check if you have git installed and in your PATH.
从前面的错误信息看,以为Promise和web3版本有问题,经查package.json文件,web3版本为1.0.0-beta.34
,已是最新版本。Promise也无太问题,继续看错误,提示容器没有git(因为要用git下载WebSocket-Node)。换另一思路,先进入node:alpine容器内,再手动调用npm start
。启动容器命令:
docker run -it -v /home:/home node:alpine sh
-v /home:/home表示挂载主机的/home目录到容器的/home目录,方便测试(因为js文件在/home目录下)。结果如旧。
三、换nodejs版本
后与网友确认nodejs版本为8.11.2,但dockerhub上只有8.11.3,先确认是否版本问题,拉取镜像:
docker pull node:8.11.3-alpine
做法如上,但依然出错,问题不在此。(注:这个仅是为了记录当时解决问题的过程)
四、继续换思路
回至问题原因,是没有安装git。于是考虑使用ubuntu镜像,但该镜像需要安装git,继而考虑在本地主机下载nodejs依赖包。在server.js目录下执行:
npm install
发现安装过程还是有问题(具体信息未及时记录,但提示了node/nodejs版本过低)。
五、更新node
更新命令:
npm install npm@latest -g
n stable
六、更新nodejs
查看nodejs版本:
$ nodejs -v
v4.2.6
卸载nodejs
$ sudo apt remove nodejs
新加文件:/etc/apt/sources.list.d/nodesource.list,在该文件写入:
deb https://deb.nodesource.com/node_6.x xenial main
deb-src https://deb.nodesource.com/node_6.x xenial main
保存文件。然后下载gpg key:
curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | sudo apt-key add -
更新源:
sudo apt-get update
查看nodejs备选版本:
sudo apt-cache policy nodejs
nodejs:Installed: 6.14.3-1nodesource1Candidate: 6.14.3-1nodesource1Version table:*** 6.14.3-1nodesource1 500500 https://deb.nodesource.com/node_6.x xenial/main amd64 Packages100 /var/lib/dpkg/status4.2.6~dfsg-1ubuntu4.1 500500 http://mirrors.cloud.aliyuncs.com/ubuntu xenial-updates/universe amd64 Packages4.2.6~dfsg-1ubuntu4 500500 http://mirrors.cloud.aliyuncs.com/ubuntu xenial/universe amd64 Packages
安装nodejs:
sudo apt-get install nodejs
查看nodejs版本:
nodejs -v
v6.14.3
七、继续尝试
更新node、nodejs后,在主机的server.js目录下执行:
npm install
安装的依赖包存放在node_modules目录下。运行npm start,可看到正常的运行结果。说明依赖包已经完全安装成功。
八、打包docker
由于server.js
依赖的包在node_modules目录下,因此,可以将这个目录先打包到镜像的/home/Service目录,然后以此作为基础镜像,再将server.js
和package.json
拷贝到/home/Service目录,就能完成docker环境的搭建。Dockerfile内容与前面相差不大。
构建好的docker镜像可用
docker pull latelee/node
拉取。
本文尝试的方法和思路仅供参考。
我的docker随笔16:构建一个特定的nodejs镜像相关推荐
- 我的docker随笔25:一个测试用的镜像制作过程
本文记录制作一个镜像的过程,先构建可运行静态程序的镜像,以此为基础,构建一个golang语言编写的web服务器,可获取容器的主机.内核版本等信息.该镜像可用于 k8s 和 KubeEdge 群集测试. ...
- Docker多步构建更小的Java镜像
译者按: 最新版Docker将支持多步构建(Multi-stage build),这样使用单个Dockerfile就可以定义多个中间镜像用于构建,测试以及发布等多个步骤,并且有效减小最终镜像的大小. ...
- 构建一个简单的go-web镜像
首先县一个简单的go项目 一个简单的dd.go 文件,启动一个web服务 func main() {mux := http.NewServeMux()mux.HandleFunc("/hel ...
- 【Docker】Dockerfile构建自定义进阶的helloworld镜像-1
之前一篇构建了最简单的helloworld程序,只是在命令行界面打印,此篇博客尝试需要环境依赖的镜像(flask框架)构建,实现的效果是能在网页上显示helloworld. 1 项目准备 创建项目文件 ...
- Docker Hub 最受欢迎的10大镜像
Docker CEO Ben Golub在2014年的DockerCon上发布Docker Hub,并指出已经有超过14,000个Docker化的应用存储在他们的publc registry中.而根据 ...
- java的linux内核构建,构建一个Docker 的Java编译环境
用Dockerfile 构建一个Java的编译环境 1.包括以下软件包 Ubuntu jdk maven svn 2.jdk.maven 需要手动下载,下载之后分别为 jdk-8u51-linux-x ...
- 【ORACLE】从安装ORACLE LINUX 8开始构建一个ORACLE21C的docker镜像
前言 最近有不少ORACLE21C的特性想测试,但是它有些特性是基于ORACLE LINUX操作系统的,网上没搜到现成docker或者虚拟机镜像,而且oracle cloud免费的21c体验不对中国区 ...
- Docker学习笔记之四,构建一个Redis as a Service(RAAS)
Docker的抽象 若把一台Linxu机器比喻为一艘船,那么每一个Linux Container就好比船上的一个集装箱. 另外一个层面,Docker Image(镜像)就是一个预先定义行为的模板,Do ...
- 如何从0到1构建一个稳定、高性能的Redis集群?(附16张图解)
阅读本文大约需要 13 分钟. 大家好,我是 Kaito. 这篇文章我想和你聊一聊 Redis 的架构演化之路. 现如今 Redis 变得越来越流行,几乎在很多项目中都要被用到,不知道你在使用 Red ...
最新文章
- 甲骨文推出全新Oracle Cloud at Customer
- Linux开发中 MD5值的计算
- Slim Span UVA - 1395
- Gym 102798A(思维) acm寒假集训日记21/12/31or22/1/1
- 【BZOJ1568】【Tyvj3490】Blue Mary开公司 李超线段树
- PE 文件格式 详解 一
- Security - 轻量级Java身份认证、访问控制安全框架
- 基于HLS流媒体协议视频加密的解决方案
- mysql2014版本下载_Microsoft SQL Server 2014 Express
- mt管理器主题修改教程_华为格式状态栏使用教程
- 怎么算特征值和特征矩阵?
- 网页前端培训(JavaScript)
- Fernando Torres
- 最大公约数简便算法_三种求最大公约数的方法
- iOS APP版本自动更新
- sinon.stub_JavaScript测试工具对决:Sinon.js vs testdouble.js
- 计算机光驱无法启用,刻录的系统盘用USB光驱无法启动是怎么回事?
- 传奇战盟GOM引擎登录器配置教程
- iOS 图片合成(一)
- 微型连接器行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
热门文章
- 违规停放共享单车 319人被纳入限制骑行“黑名单”
- 黑龙江省:到2025年将建成5G基站11.4万个
- 苹果抢安卓用户出“杀手锏”,连安卓手机App都能一键同步
- 特斯拉:部分帖文包含不实信息 将定期分享真实情况
- 苹果推出App Store搜索建议功能
- 华为nova8系列获得3C认证:搭载66W超级快充怒追Mate40
- iPhone 12延期恐实锤:台积电5nm A14芯片将延期3个月
- 微信iOS版本推出深色模式,网友:终于可以“好好熬夜”了!
- 受疫情影响:中国智能手机市场Q1出货量下滑严重
- 完美世界:实习生已排除冠状病毒感染性肺炎可能