如下便是jenkins从git拉下代码后直接发送到服务器的基于nodejs的nuxt ssr项目docker_nuxt(因为用docker就不需要再Jenkins中构建了),其中重点就是Dockerfile和docker_build.sh,其余除了ecosystem.config.js都是项目目录和文件
[root@sgr3xwozl6izswys docker_nuxt]# ls
api.config.js assets docker_build.sh components Dockerfile
ecosystem.config.js jsconfig.json layouts nuxt.config.js
package.json pages plugins README.md static store yarn.lock
[root@sgr3xwozl6izswys docker_nuxt]#
也可以新建一个.dockerignore指定忽略打包到镜像的目录和文件
*.sh
其中Dockerfile和.dockerignore是一定会传递到docker上下文中,即使在.dockerignore中指定也不会生效
Dockerfile
FROM node:12-alpine
MAINTAINER 502763576@qq.com
WORKDIR /app
COPY . /app
#alpine版本内置npm和yarn
RUN yarn install
RUN yarn build
ENTRYPOINT ["yarn"]
CMD ["start"]
注意:在build镜像的时候上下文指定的是.(即当前执行build命令的目录)
RUN是构建镜像时执行
ENTRYPOINT和CMD是运行容器时执行,这里我都使用的是exec的方式,因为比shell方式更好控制,可以在执行docker run时用参数替换CMD的start
build.sh
#!/bin/sh
echo "开始执行$0........................"
imageName='nuxtimg'
containerName='my_nuxt'
port=3000
outPort=3000
startEnv=$1
echo "准备发布scripts:${startEnv}>>>>>>>>>>>>>>>>>>"
if [[ -n $(docker ps -q -f name=${containerName}) ]]; then
docker stop ${containerName}
echo "容器${containerName}已停止!!!"
docker rm ${containerName}
echo "容器${containerName}已删除!!!"
docker rmi ${imageName}
echo "镜像${nuxtimg}已删除!!!"
docker build -t ${imageName} .
echo "镜像${nuxtimg}已构建!!!"
docker run -d --name ${containerName} -p ${outPort}:${port} ${imageName} ${startEnv}
echo "容器${containerName}已运行!!!"
else
if [[ -n $(docker ps -a -q -f name=${containerName}) ]]; then
docker rm ${containerName}
echo "容器${containerName}已删除!!!"
docker rmi ${imageName}
echo "镜像${nuxtimg}已删除!!!"
docker build -t ${imageName} .
echo "镜像${nuxtimg}已构建!!!"
docker run -d --name ${containerName} -p ${outPort}:${port} ${imageName} ${startEnv}
echo "容器${containerName}已运行!!!"
else
if [[ -n $(docker images -q ${imageName}) ]]; then
docker rmi ${imageName}
echo "镜像${nuxtimg}已删除!!!"
docker build -t ${imageName} .
echo "镜像${nuxtimg}已构建!!!"
docker run -d --name ${containerName} -p ${outPort}:${port} ${imageName} ${startEnv}
echo "容器${containerName}已运行!!!"
else
docker build -t ${imageName} .
echo "镜像${nuxtimg}已构建!!!"
docker run -d --name ${containerName} -p ${outPort}:${port} ${imageName} ${startEnv}
echo "容器${containerName}已运行!!!"
fi
fi
fi
这里就是判断了是否已运行或存在对应容器和镜像,不然对不存在的容器做删除操作会抛出错误导致Jenkins中止然后构建失败
startEnv为最后运行容器时需要传递的参数,用来覆盖Dockerfile中的CMD以在不同环境下发布项目,该参数由jenkins中配置传递,如下: