[智开系统] 01. 智开平台项目构建与开发全解析

1、前言:

本文深入探讨智开平台的项目结构和关键开发要点,旨在为开发者提供清晰、细致的指南。通过解析项目的目录布局、关键文件功能,以及重要配置项,本文旨在帮助开发者高效掌握如何构建、维护和优化智开平台上的应用。此外,文中还将涉及最佳实践和常见问题解决策略,确保开发者能在智开平台上实现流畅、高效的项目开发和部署。

2、项目结构:

./
├── Dockerfile               # Docker配置文件,用于构建Docker镜像
├── README                   # 项目说明文档,通常包含项目介绍、安装和使用指南
├── build.sh                 # 构建脚本,用于自动化编译和构建过程
├── dockerContainerStart.sh  # Docker容器启动脚本,用于启动Docker容器
├── nginx.conf               # Nginx配置文件,配置Web服务器的工作参数
├── out                      # 输出目录,通常用于存放构建或编译后的文件
├── updater_api              # 项目后端目录,包含API服务的代码和资源
└── updater_web              # 项目前端目录,包含前端Web应用的代码和资源

一个标准的项目结构通常涵盖前端和后端代码、服务容器配置、以及镜像打包相关的文件。此外,它还包括专门为容器初始化阶段设计的启动脚本,如dockerContainerStart.sh,确保容器在启动时能够按预定流程运行。这样的组织方式不仅确保了项目的高效运行,同时也促进了开发和部署的便捷性。

3、dockerfile讲解

在制作平台安装包前,首要步骤是创建一个功能齐全的Docker镜像。此镜像的核心作用是封装前端和后端的构建产物——包括前端的dist目录和后端的jar文件,并同时整合前后端的生产环境。这一过程确保了最终用户能够实现“开箱即用”,无需额外配置即可启动和运行平台。

下面是个典型的dockerfile文件的内容:

# 使用一个最小的Debian镜像,已预装nodejs18和nginx1.18.0
FROM zhikai_platform_slim_amd:1.0.0
 
# 第一阶段:安装基础工具
# 更新软件包列表并安装基础工具
RUN apt-get update && apt-get install -y \
    vim \
    curl \
    docker.io \
 && rm -rf /var/lib/apt/lists/*
 
# 将本地的nginx.conf文件拷贝到容器中的Nginx配置目录
COPY nginx.conf /etc/nginx/nginx.conf
 
# 设置npm国内镜像源以加速依赖安装
RUN npm config set registry https://registry.npmmirror.com
 
# 安装后端全局依赖
RUN npm install -g node-pre-gyp node-gyp nodemon
 
# 第二阶段:安装前端项目
# 设置工作目录为 /app/updater_web
WORKDIR /app/updater_web
 
# 复制前端项目到工作目录
COPY updater_web /app/updater_web/
 
# 安装前端项目依赖并构建项目
RUN npm install \
 && npm run build
 
# 将前端产物拷贝到Nginx默认静态文件目录并清理工作目录
RUN cp -r ./zkupdate /usr/share/nginx/html/zkupdate \
 && cd / \
 && rm -rf /app/updater_web
 
# 第三阶段:安装后端项目
# 设置工作目录为 /app/updater_api
WORKDIR /app/updater_api
 
# 复制后端项目到工作目录
COPY updater_api /app/updater_api/
 
# 创建必要的目录
RUN mkdir -p /updater_api/uploads/cache/
 
# 安装后端项目依赖
RUN npm install
 
# 暴露Nginx和后端服务端口
EXPOSE 80
EXPOSE 50005
 
# 安装pm2以管理Node.js应用
RUN npm i pm2 -g
 
# 安装SSH服务并配置
RUN apt-get update \
 && apt-get install openssh-server -y \
 && echo "root:huang12563" | chpasswd
 
# 配置webssh2服务
COPY ./updater_api/webssh2 /app/webssh2
WORKDIR /app/webssh2/app
RUN npm install --production
 
# 配置SSHD服务
COPY ./updater_api/webssh2/sshd/sshd_config /etc/ssh/
EXPOSE 22
EXPOSE 2222
 
# 其他服务端口
EXPOSE 7306
 
# 设置启动脚本
COPY ./dockerContainerStart.sh /opt/dockerContainerStart.sh
RUN chmod +x /opt/dockerContainerStart.sh
 
# 设置容器启动时执行的命令
ENTRYPOINT ["/opt/dockerContainerStart.sh"]

核心点:

1、 通过命令COPY updater_web /app/updater_web/,将前端项目代码复制到容器内部。为了优化构建过程和减少镜像体积,可以利用.dockerignore文件排除不必要同步的文件或目录,例如node_modules。这种做法不仅减轻了镜像的负担,还加快了构建速度。一旦前端项目编译完成,原始代码将被移除,仅留下编译后的产物。

2、通过命令COPY updater_api /app/updater_api/,后端项目代码被复制到容器内。考虑到项目使用Node.js环境,源代码直接参与运行时执行,因此无需删除。这种做法确保了源代码和运行时环境的一致性。

综合来看,Docker镜像的构建流程不仅包括将前后端代码复制到容器内部并执行编译过程,还涉及保留运行所需的最终产物,同时清除不必要的源代码和文件,以此达到优化镜像体积和提高运行效率的目标。此外,通过构建一个完整的运行环境,即可以确保开发环境下的产物能够无缝迁移到生产环境,实现“开箱即用”的便捷性,确保开发与生产环境的一致性和应用的稳定运行。

4、安装包生成

通过在根目录下运行sh build.sh,即可在/out文件夹下生成zhikai_updater_platform1.0.0.tar镜像。当要部署时可以将out文件夹拷贝到任意目录,并在out目录下执行sh setup.sh <版本号> <服务器ip>即可进行自动安装。

zhikai_updater_platform1.0.0.tar的编译过程是发生在/out文件夹中,out文件夹中的结构如下:

.
├── dockerContainerStart.sh 
├── setup.sh
├── setup.sql
└── zhikai_updater_platform1.0.0.tar

1、dockerContainerStart.sh脚本。

提取dockerContainerStart.sh脚本并通过挂载目录的方式将其放置于宿主机上,是一种灵活的策略,旨在简化容器启动脚本的更新和管理。这种做法避免了每次修改启动脚本时都需要重新构建Docker镜像,从而提高了开发和部署的效率。具体步骤和优势如下:

  1. 分离启动脚本dockerContainerStart.sh脚本在Dockerfile构建过程中被包含在镜像里,如果该脚本需要频繁修改,每次都需重新构建镜像,这可能造成效率低下。
  2. 挂载启动脚本:通过在setup.sh安装脚本中挂载启动脚本所在的目录到宿主机,可以直接在宿主机上对启动脚本进行修改。
  3. 覆盖镜像中的脚本:使用cp命令将宿主机上的启动脚本覆盖到镜像中原本的启动脚本位置,这确保了容器使用的是最新的脚本版本。
  4. 灵活性与便利性:这种方法为开发者提供了更高的灵活性和便利性,特别是在需要频繁更新启动脚本的场景中。开发者无需每次都重新构建整个镜像,而是仅对启动脚本进行修改即可。
  5. 非频繁修改场景:如果启动脚本不需要频繁修改,可以选择不将其放置在out目录中,避免挂载和覆盖的步骤,从而简化部署流程。

2、setup.sh :

#!/bin/bash
 
# 示例:sh ./setup.sh 1.0.0 xxx.xxx.xxx.xxx
 
packageVersion=$1
locationIp=$2
 
# 加载 Docker 镜像并创建必要目录
docker load -i "./zhikai_updater_platform${packageVersion}.tar"
mkdir -p /opt/zkupdate/{uploads/cache,db,deltaUploadTemp,att_static,initSql,mysql}
sudo chmod -R 777 /opt/zkupdate/
 
# 停止并删除容器(如果存在)
docker stop zhikai_platform || true
docker rm zhikai_platform || true
 
# 复制 SQL 脚本
cp ./setup.sql /opt/zkupdate/initSql/
# 复制容器入口脚本文件
cp ./dockerContainerStart.sh /opt/zkupdate/
 
containerName="zhikai_platform"
# 运行 Docker 容器
docker run \
  --name $containerName \
  --privileged=true \
  -d \
  -p 7080:80 \
  -p 7306:3306 \
  -p 2222:2222 \
  -p 50005:50005 \
  -e hostIp=${locationIp} \
  --add-host hostIp:${locationIp} \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /opt/zkupdate/uploads:/app/updater_api/uploads \
  -v /opt/zkupdate/deltaUploadTemp:/app/updater_api/deltaUploadTemp \
  -v /opt/zkupdate/att_static:/app/updater_api/att_static \
  -v /opt/zkupdate/initSql:/app/initSql \
  -v /opt/zkupdate/:/opt \
  "zhikai_updater_platform:${packageVersion}"
  1. 加载Docker镜像:使用docker load命令加载指定版本的Docker镜像。
  2. 创建必要目录:在宿主机的/opt/zkupdate/路径下创建多个目录,用于存储上传文件、数据库文件、临时文件等,并设置相应的权限。
  3. 停止并删除旧容器:如果名为“zhikai_platform”的容器已存在,先停止并删除,确保可以部署新的容器实例。
  4. 复制SQL脚本和启动脚本
    • 将SQL初始化脚本复制到/opt/zkupdate/initSql/
    • 将容器启动脚本(dockerContainerStart.sh)复制到/opt/zkupdate/
  5. 运行Docker容器:使用docker run命令启动容器,并进行了如下配置:
    • 设置容器名称。
    • 以特权模式运行。
    • 将容器内部端口映射到宿主机的对应端口,包括HTTP服务、MySQL服务、SSH服务和自定义服务端口。
    • 通过环境变量传递主机IP。
    • 使用--add-host在容器的/etc/hosts添加主机IP条目。
    • 将宿主机的Docker套接字映射到容器内部,允许容器内部操作宿主机的Docker。
    • 将宿主机上创建的目录挂载到容器内部相应的位置,用于持久化存储和数据共享。
    • 指定使用的镜像和标签。

通过这个脚本,可以方便地部署和启动“zhikai_platform”容器,同时确保了数据的持久化和服务的正确配置。

3、setup.sql:用于初始化数据库结构

4、zhikai_updater_platform1.0.0.tar:这是dockerfile生成的镜像文件

5、结语

本文介绍智开平台项目的核心结构、关键开发要点以及部署策略。不仅揭示了项目目录的布局和关键文件的作用,还详细讲解了Docker容器化技术在项目构建和部署中的应用。从基本的项目架构到Dockerfile的细节解读,再到安装包生成和容器启动脚本的策略,提供了一套全面的指南,旨在帮助开发者在智开平台上实现高效且一致的项目开发和部署。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部