以前一直觉得docker是运维用的工具,或者devops 用的工具,一般人应该用不上,直到最近发现docker 还有另外一个妙用,不管是什么语言。
会网络不好的时候,nodejs npm 仓库 、ruby gem仓库、python的 PyPI 、java 的Maven 等都不是很稳定,容易挂,
还有就是长时间没有更改构建过程的 项目再次初始化时候不是找不见依赖包,就是从github 下载资源失败等等都导致项目初始化失败,
特别是封闭式开发(断网)或者驻厂开发(特殊环境只能上内网)都无法从这些源下载依赖包
用docker 可以很好的解决这个问题
以nodejs为例 ,这是我一个项目中的 Dockerfile 文件
#设置基础镜像,如果本地没有该镜像,会从Docker.io服务器pull镜像
FROM node:8.5.
#创建app目录,保存我们的代码
RUN mkdir -p /usr/src/node
#设置工作目录
WORKDIR /usr/src/node #复制所有文件到 工作目录。
COPY . /usr/src/node #编译运行node项目,使用npm安装程序的所有依赖,利用taobao的npm安装
#ENV NODE_ENV production
ENV NODE_ENV development WORKDIR /usr/src/node/
RUN npm install #暴露container的端口
EXPOSE #运行命令
#CMD ["npm", "run","web"]
CMD ["npm", "run","getdata"]
然后执行构建镜像的命令
webjs@webjs-upc:~/codepalce/nodejslearn$ sudo docker build -t my-spider .
Sending build context to Docker daemon 7.52 MB
Step : FROM node:8.5.
---> de1099630c13
Step : RUN mkdir -p /usr/src/node
---> Using cache
---> 5d5f5bc2b37c
Step : WORKDIR /usr/src/node
---> Using cache
---> 6dd09a7a7e9e
Step : COPY . /usr/src/node
---> a57935049527
Removing intermediate container 8a0d964fe8e9
Step : ENV NODE_ENV development
---> Running in 8e5098063d3a
---> 4fb90a8eed24
Removing intermediate container 8e5098063d3a
Step : WORKDIR /usr/src/node/
---> Running in b07d42075879
---> 108f84cfeeae
Removing intermediate container b07d42075879
Step : RUN npm install
---> Running in 69b936a8763f
npm info it worked if it ends with ok
npm info using npm@5.3.
npm info using node@v8.5.0
npm info lifecycle OpenShift-Sample-App@1.0.~preinstall: OpenShift-Sample-App@1.0.
npm http fetch GET https://registry.npmjs.org/js-base64 876ms
npm http fetch GET https://registry.npmjs.org/express 911ms
npm http fetch GET https://registry.npmjs.org/async 140ms
npm http fetch GET https://registry.npmjs.org/request 160ms
可以看到执行npm install 后开始安装npm依赖包,最后看下镜像大小
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 108f84cfeeae minutes ago 679.8 MB
my-spider latest 2cf0919aa431 days ago 758.1 MB
my-web latest 2cf0919aa431 days ago 758.1 MB
生成的镜像大约500m,生成的这些镜像都包含了依赖包,在其他机器上使用这些包时候都不用在下载这些依赖