使用jenkins+Dockerfile打包部署nodejs项目

    如下便是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中配置传递,如下:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值