使用docker编译前后端项目
前端项目编译build后,把生成的文件放在后端的public中,然后后端使用dockerfile进行编译
后端nestjs项目:
#第一个阶段:拉取node镜像来打包React项目,as build是给该阶段起名字 FROM node:14 as build #设置docker命令的运行目录,工作空间 WORKDIR /app # 复制src等目录文件到工作空间中 必入 COPY src src/ 表示复制当前src文件夹中的内容到 工作空间(无则创建文件夹) COPY public /app/public COPY src /app/src COPY package.json ./ COPY tsconfig.json ./ COPY nest-cli.json ./ COPY tsconfig.build.json ./ RUN npm set registry https://registry.npm.taobao.org RUN npm install RUN npm run build # 第二个阶段:创建并运行Nginx服务器,并且把打包好的文件复制到服务器文件夹中 # 暴露端口 EXPOSE 4000 CMD ["node","dist/main.js"]
如果是纯前端项目:
#第一个阶段:拉取node镜像来打包React项目,as build是给该阶段起名字 FROM node:14 as build #设置docker命令的运行目录,工作空间 WORKDIR /app # 复制src等目录文件到工作空间中 必入 COPY src src/ 表示复制当前src文件夹中的内容到 工作空间(无则创建文件夹) COPY dist ./ # 第二个阶段:创建并运行Nginx服务器,并且把打包好的文件复制到服务器文件夹中 FROM nginx:alpine # 复制build阶段中 app/build打包文件内容到 nginx文件夹下 COPY --from=build /app/ /usr/share/nginx/html # 暴露端口 EXPOSE 80 CMD ["nginx","-g","daemon off;"]
使用pm2启动,参考文章:
https://segmentfault.com/q/1010000007258157
https://pm2.keymetrics.io/docs/usage/docker-pm2-nodejs/
#第一个阶段:拉取node镜像来打包React项目,as build是给该阶段起名字 FROM node:14 as build #设置docker命令的运行目录,工作空间 WORKDIR /app # 复制src等目录文件到工作空间中 必入 COPY src src/ 表示复制当前src文件夹中的内容到 工作空间(无则创建文件夹) COPY public /app/public COPY src /app/src COPY package.json ./ COPY tsconfig.json ./ COPY nest-cli.json ./ COPY tsconfig.build.json ./ COPY start.json ./ # RUN npm set registry http://registry.m.jd.com RUN npm set registry https://registry.npm.taobao.org RUN npm install RUN npm run build RUN npm install -g pm2 node-gyp # 第二个阶段:创建并运行Nginx服务器,并且把打包好的文件复制到服务器文件夹中 # 暴露端口 EXPOSE 4000 # CMD ["node","dist/main.js"] CMD ["pm2-runtime","start.json"]
对应的start.json
{ "apps": [ { "name": "esc-web", "max_memory_restart": "500M", "script": "/app/dist/main.js", "instances": 1 } ] }
docker build -t react-web:1.0 .
docker run -d -p 4000:4000 react-web:1.0
`docker stop $(docker ps -aq)`停止所有容器
`docker rm $(docker ps -aq)` 删除所有容器
`docker images`可以查看当前的镜像
`docker rmi $(docker images -q)`删除全部 image
`docker run -it react-web:1.0 /bin/bash`进入容器内部执行指令