因为笔者之前都是用docker来跑php的,这里的php用的还是php-fpm,只不过开启opchace
,以前跑node.js的时候,我并没有用docker来运行,用的pm2.js。所以并没有在意这些。
现在还在用node.js 8,不过现在看到node.js 13了,我是有点担心node.js的api兼容性问题,所以今天在部署环境的时候,还是考虑用docker来管理node.js版本,你会说,不是有node.js n nvm之类的管理吗?有是有,可是我个人感觉没有docker 直接用镜像的来区分更加方便。
我在编写Dockerfile的时候,会先去github
上浏览一下别人的代码,我找了一下,大致很多人的代码,都是Docker
,并没有使用docker-compose
,也有一些是用上的,不过他们是和他们的项目结构捆绑在一起的docker-compose
。我想要的是
类似自己编写的容器编排程序,nginx 做了负载均衡 代理 nginx_web
和 varnish 静态缓存服务器。
我需要把我的php
程序放到我的app文件下就可以运行的docker-compose
。
于是我就编写了而不是还要参考你项目结构的Dockerfile镜像,我只需要一个纯净的node.js和项目需要的node_models
,而不是你项目原先已经规定好的项目结构和已经把我打包的node_models镜像。
首先我们docker-compose
容器编排文件如下
version: "3"
services:
app:
build: .
# image: myphp:latest
ports:
- 80:80
volumes:
- ./apisocket:/app
environment:
- TZ=Asia/Shanghai
networks:
frontend:
backend:
Dockerfile 如下
FROM node:8.9-alpine
RUN mkdir /app
VOLUME [ "/app" ]
WORKDIR /app
RUN npm config set unsafe-perm true #如果在docker 不添加这个 会报Error: could not get uid/gid的错误
RUN npm set registry https://registry.npm.taobao.org/
RUN npm install -g pm2 typescript
RUN npm install
CMD ["pm2-docker","dist/app.js"]
EXPOSE 80
可是笔者在运行的时候,发现一个问题,在build的镜像的过程中,死活不能build成功!!!
他会在 npm install
中报一个错误!,not cna't open package.json。
由于我以前做的php 容器编排 都是这么处理的呀。怎么的到了编译形式语言就不能node.js就不能呢?
我不是在docker-compose.yml 上把项目路径映射容器了吗???
我对Dockerfile也没有深入了解,也就看来一下Dockerfile几个关键词而已。
我经过半个小时的沉思之后,我猜测一个想法,就是docker-compose
在运行的时候,的路径映射是不参与打包镜像里面的。
所以npm install
这一类的操作应当放在 docker-compose.yml的command属性中进行操作。
所以后面我的两个文件有进行了修改
# Dockerflie
FROM node:8.9-alpine
RUN mkdir /app
VOLUME [ "/app" ]
WORKDIR /app
RUN npm config set unsafe-perm true
RUN npm set registry https://registry.npm.taobao.org/
RUN npm install -g pm2 typescript
EXPOSE 80
# docker-compose.yml
version: "3"
services:
app:
build: .
# image: myphp:latest
ports:
- 80:80
volumes:
- ./apisocket:/app
environment:
- TZ=Asia/Shanghai
command:
- sh
- -c
- |
npm install
npm run tsc
pm2-docker dist/app.js
networks:
frontend:
backend:
这样之后,无论你什么node.js项目都好,只要你改名为app文件,
并修改 pm2-docker dist/app.js这里,都可以愉快的运行
只要 sudo docker-compose up
和 sudo docker-compose down
如果切换node.js 只需要去 Dockerfile中修改一下数字
然后 sudo docker images && sudo docker rmi [imageId] 。
之后再运行 sudo docker-compose up
从新制作新的容器镜像。
网友评论