xiaoming728

xiaoming728

Docker 启停 Pm2 项目

3
2025-06-09

使用 GIt 拉取项目代码到本地

yum install -y git
git clone https://xxxxx.git
git branch -r

二选一

git checkout 分支名
git checkout -b 本地分支名 origin/远程分支名

Dockerfile

# 使用 Node.js 官方镜像作为基础镜像
FROM node:18.20.3 as build-stage
# 设置npm镜像源
RUN npm config set registry https://registry.npmmirror.com
# 创建工作目录并设置工作目录
RUN mkdir -p /app
WORKDIR /app
# 复制项目文件和目录到容器中
COPY . /app
# 全局安装 pm2 和 pnpm
RUN npm install pm2 -g
RUN npm install pnpm -g
# 安装依赖项并构建应用程序
RUN pnpm install && \
    pnpm build
# 清理node_modules目录
RUN rm -rf ./node_modules
# 指定容器启动时执行的命令
CMD ["pm2-runtime", "ecosystem.config.cjs"]

启动脚本

# start.sh 启动脚本
#!/bin/bash
# 切换到项目源码目录
cd /opt/system/xxxx
# 定义镜像和容器名称
IMAGE_NAME="xxxx"
CONTAINER_NAME="xxxx"
# 检查镜像是否已经存在,如果不存在则构建镜像
if [[ "$(docker images -q $IMAGE_NAME 2> /dev/null)" == "" ]]; then
  echo "构建 Docker 镜像 $IMAGE_NAME ..."
  docker build -t $IMAGE_NAME .
fi
# 检查容器是否已经在运行
RUNNING=$(docker inspect --format="{{.State.Running}}" $CONTAINER_NAME 2>/dev/null)
if [ "$RUNNING" == "true" ]; then
  echo "容器 $CONTAINER_NAME 已经在运行."
else
  # 如果容器不存在或者停止了,启动容器
  echo "启动 Docker 容器 $CONTAINER_NAME ..."
  docker run -d --name $CONTAINER_NAME -p 8400:8400 $IMAGE_NAME
fi

停止脚本

# stop.sh 停止的shell脚本
# !/bin/bash
# 定义镜像和容器名称
IMAGE_NAME="xxxx"
CONTAINER_NAME="xxxx"
# 检查容器是否已经运行
RUNNING=$(docker inspect --format="{{.State.Running}}" $CONTAINER_NAME 2>/dev/null)
if [ "$RUNNING" == "true" ]; then
  # 如果容器正在运行,先停止容器
  echo "停止 Docker 容器 $CONTAINER_NAME ..."
  docker stop $CONTAINER_NAME
fi
# 检查并删除容器
EXIST=$(docker ps -a --filter "name=$CONTAINER_NAME" --format "{{.Names}}")
if [ ! -z "$EXIST" ]; then
  # 如果容器存在,删除容器
  echo "删除 Docker 容器 $CONTAINER_NAME ..."
  docker rm $CONTAINER_NAME
else
  echo "容器 $CONTAINER_NAME 不存在."
fi
# 检查并删除镜像
EXIST_IMAGE=$(docker images -q $IMAGE_NAME 2>/dev/null)
if [ ! -z "$EXIST_IMAGE" ]; then
  # 如果镜像存在,删除镜像
  echo "删除 Docker 镜像 $IMAGE_NAME ..."
  docker rmi $IMAGE_NAME
else
  echo "镜像 $IMAGE_NAME 不存在."
fi