一、背景

某网友需要对区块链交易的项目进行测试。测试脚本需要在nodejs环境中运行,脚本有server.jspackage.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.jspackage.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.jspackage.json拷贝到/home/Service目录,就能完成docker环境的搭建。Dockerfile内容与前面相差不大。
构建好的docker镜像可用

docker pull latelee/node

拉取。

本文尝试的方法和思路仅供参考。

我的docker随笔16:构建一个特定的nodejs镜像相关推荐

  1. 我的docker随笔25:一个测试用的镜像制作过程

    本文记录制作一个镜像的过程,先构建可运行静态程序的镜像,以此为基础,构建一个golang语言编写的web服务器,可获取容器的主机.内核版本等信息.该镜像可用于 k8s 和 KubeEdge 群集测试. ...

  2. Docker多步构建更小的Java镜像

    译者按: 最新版Docker将支持多步构建(Multi-stage build),这样使用单个Dockerfile就可以定义多个中间镜像用于构建,测试以及发布等多个步骤,并且有效减小最终镜像的大小. ...

  3. 构建一个简单的go-web镜像

    首先县一个简单的go项目 一个简单的dd.go 文件,启动一个web服务 func main() {mux := http.NewServeMux()mux.HandleFunc("/hel ...

  4. 【Docker】Dockerfile构建自定义进阶的helloworld镜像-1

    之前一篇构建了最简单的helloworld程序,只是在命令行界面打印,此篇博客尝试需要环境依赖的镜像(flask框架)构建,实现的效果是能在网页上显示helloworld. 1 项目准备 创建项目文件 ...

  5. Docker Hub 最受欢迎的10大镜像

    Docker CEO Ben Golub在2014年的DockerCon上发布Docker Hub,并指出已经有超过14,000个Docker化的应用存储在他们的publc registry中.而根据 ...

  6. java的linux内核构建,构建一个Docker 的Java编译环境

    用Dockerfile 构建一个Java的编译环境 1.包括以下软件包 Ubuntu jdk maven svn 2.jdk.maven 需要手动下载,下载之后分别为 jdk-8u51-linux-x ...

  7. 【ORACLE】从安装ORACLE LINUX 8开始构建一个ORACLE21C的docker镜像

    前言 最近有不少ORACLE21C的特性想测试,但是它有些特性是基于ORACLE LINUX操作系统的,网上没搜到现成docker或者虚拟机镜像,而且oracle cloud免费的21c体验不对中国区 ...

  8. Docker学习笔记之四,构建一个Redis as a Service(RAAS)

    Docker的抽象 若把一台Linxu机器比喻为一艘船,那么每一个Linux Container就好比船上的一个集装箱. 另外一个层面,Docker Image(镜像)就是一个预先定义行为的模板,Do ...

  9. 如何从0到1构建一个稳定、高性能的Redis集群?(附16张图解)

    阅读本文大约需要 13 分钟. 大家好,我是 Kaito. 这篇文章我想和你聊一聊 Redis 的架构演化之路. 现如今 Redis 变得越来越流行,几乎在很多项目中都要被用到,不知道你在使用 Red ...

最新文章

  1. 甲骨文推出全新Oracle Cloud at Customer
  2. Linux开发中 MD5值的计算
  3. Slim Span UVA - 1395
  4. Gym 102798A(思维) acm寒假集训日记21/12/31or22/1/1
  5. 【BZOJ1568】【Tyvj3490】Blue Mary开公司 李超线段树
  6. PE 文件格式 详解 一
  7. Security - 轻量级Java身份认证、访问控制安全框架
  8. 基于HLS流媒体协议视频加密的解决方案
  9. mysql2014版本下载_Microsoft SQL Server 2014 Express
  10. mt管理器主题修改教程_华为格式状态栏使用教程
  11. 怎么算特征值和特征矩阵?
  12. 网页前端培训(JavaScript)
  13. Fernando Torres
  14. 最大公约数简便算法_三种求最大公约数的方法
  15. iOS APP版本自动更新
  16. sinon.stub_JavaScript测试工具对决:Sinon.js vs testdouble.js
  17. 计算机光驱无法启用,刻录的系统盘用USB光驱无法启动是怎么回事?
  18. 传奇战盟GOM引擎登录器配置教程
  19. iOS 图片合成(一)
  20. 微型连接器行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)

热门文章

  1. 违规停放共享单车 319人被纳入限制骑行“黑名单”
  2. 黑龙江省:到2025年将建成5G基站11.4万个
  3. 苹果抢安卓用户出“杀手锏”,连安卓手机App都能一键同步
  4. 特斯拉:部分帖文包含不实信息 将定期分享真实情况
  5. 苹果推出App Store搜索建议功能
  6. 华为nova8系列获得3C认证:搭载66W超级快充怒追Mate40
  7. iPhone 12延期恐实锤:台积电5nm A14芯片将延期3个月
  8. 微信iOS版本推出深色模式,网友:终于可以“好好熬夜”了!
  9. 受疫情影响:中国智能手机市场Q1出货量下滑严重
  10. 完美世界:实习生已排除冠状病毒感染性肺炎可能