1
0

feat: 添加Docker构建

This commit is contained in:
TsMask
2025-05-15 14:40:57 +08:00
parent bbbd5471c7
commit 7891d268cb
12 changed files with 591 additions and 44 deletions

View File

@@ -0,0 +1,87 @@
## 第一阶段 ====> Nodejs打包编译输出前端资源
FROM node:20-alpine AS build-node
# 前端程序
# COPY ./omc_web /web
COPY./omc_web/src /web/src
COPY./omc_web/public /web/public
COPY./omc_web/index.html /web/index.html
COPY./omc_web/.env.production /web/.env.production
COPY./omc_web/.env.development /web/.env.development
COPY./omc_web/package-lock.json /web/package-lock.json
COPY./omc_web/package.json /web/package.json
COPY./omc_web/tsconfig.json /web/tsconfig.json
COPY./omc_web/tsconfig.node.json /web/tsconfig.node.json
COPY./omc_web/vite.config.ts /web/vite.config.ts
RUN npm config set registry https://registry.npmmirror.com
RUN cd /web && npm install && npm run build
RUN touch /web/dist/config.js && echo 'sessionStorage.clear()' | tee /web/dist/config.js
# 后端程序
# COPY ./omc_api /api
COPY ./omc_api/features /api/features
COPY ./omc_api/lib /api/lib
COPY ./omc_api/src /api/src
COPY ./omc_api/sshsvc /api/sshsvc
COPY ./omc_api/swagger_docs /api/swagger_docs
COPY ./omc_api/go.sum /api/go.sum
COPY ./omc_api/go.mod /api/go.mod
COPY ./omc_api/main.go /api/main.go
# 系统文件
COPY ./omc_api/docker/linux /linux
## 第二阶段 ====> Go打包编译输出后端程序
FROM golang:1.24-alpine AS build-golang
# 从上个阶段复制文件
COPY --from=build-node /web/dist /web
COPY --from=build-node /api /api
COPY --from=build-node /linux /linux
# 安装其他依赖
RUN apk add gcc musl-dev libpcap-dev
# 设置变量
ENV CGO_ENABLED 1
ENV GOOS linux
ENV GOPROXY https://goproxy.cn,direct
ARG VERSION
RUN cd /api && go mod download
RUN cd /api && go build -o omc -v -ldflags "-s -w \
-X 'be.ems/src/framework/config.Version=$VERSION' \
-X 'be.ems/src/framework/config.BuildTime=$(date)' \
-X 'be.ems/src/framework/config.GoVer=$(go version)'"
RUN cd /api/sshsvc && go build -o sshsvc -v -ldflags "-s -w \
-X 'be.ems/lib/global.Version=${VERSION}' \
-X 'be.ems/lib/global.BuildTime=$(date)' \
-X 'be.ems/lib/global.GoVer=$(go version)'"
## 第三阶段 ====> 构建前后端融合镜像
FROM ubuntu:22.04
# 更新apt并安装必要工具
RUN apt update -y && apt install -y \
sudo systemd libpcap-dev tzdata nginx
# 设置时区和语言环境
ENV LANG="en_US.UTF-8"
ENV TZ="Asia/Shanghai"
WORKDIR /usr/local/etc/omc
COPY --from=build-golang /linux /
COPY --from=build-golang /web /usr/local/etc/omc/web
COPY --from=build-golang /api/omc /usr/local/bin/omc
COPY --from=build-golang /api/sshsvc/sshsvc /usr/local/bin/sshsvc
EXPOSE 80 443 33030
CMD ["/sbin/init"]
# 构建
# docker build --build-arg VERSION=241101 -t omc:2.241101 .
# docker run -it omc:2.241101 sh
# service ssh start && service nginx start && /usr/local/bin/omc --env prod -c /usr/local/etc/omc/omc.yaml

109
pkg/docker/README.md Normal file
View File

@@ -0,0 +1,109 @@
# Docker 编译
编译目录内含 `omc_web``omc_api` 两个项目代码
将后端项目代码中的 `docker/Dockerfile` 文件移动到最外层目录下,`docker/omc`是内部文件挂载的文件资源。
编译目录结构
```text
probject
├── omc_web 目录-前端项目代码
├── omc_api 目录-后端项目代码
└── Dockerfile 文件-Docker编译需要
```
内部文件资源
| 路径 | 说明 |
| --------------------------- | -------------------------- |
| /usr/local/etc/omc/static | 网管静态资源文件路径 |
| /usr/local/etc/omc/upload | 网管上传文件资源路径 |
| /usr/local/etc/omc/omc.yaml | 网管配置文件 |
| /usr/local/etc/omc | 网管与网元之间相关文件 |
| /etc/nginx/cert | 网管前端 nginx 代理证书 |
| /etc/nginx/nginx.conf | 网管前端 nginx 代理配置 |
| /var/log | 网管相关日志输出 |
| /tmp/omc | 存放从网元拉取到本地的文件 |
端口声明
| 端口 | 说明 |
| ----- | ----------------------------- |
| 22 | 网管 容器内部 SSH 服务 |
| 80 | 网管 Nginx HTTP 服务 |
| 443 | 网管 Nginx HTTP2 服务 |
| 33030 | 网管后台 API HTTP 服务 |
| 33443 | 网管后台 API HTTP2 服务 |
| 33033 | 网管信令跟踪 UDP 协议接收服务 |
| 33060 | 网管性能分析监控 metrics 服务 |
## 编译
- `VERSION` 变量是后端程序打包版本号注入
```sh
docker build --build-arg VERSION="241212" -t omc:2.2412.1 .
```
## 部署
- `APPENV` 程序启动环境变量 local、prod -e APPENV="local"
```sh
docker run -d \
--privileged=true \
--restart=always \
-p 8822:22 \
-p 8880:80 \
-p 8884:443 \
-p 8830:33030 \
-p 8833:33033 \
-p 8860:33060 \
-v /home/manager/probject/omc_api/docker/omc:/usr/local/etc/omc \
-v /home/manager/probject/omc_api/docker/omc/logs:/var/log \
-v /home/manager/probject/omc_api/docker/omc/tmp:/tmp/omc \
-v /home/manager/probject/omc_api/docker/omc/nginx/cert:/etc/nginx/cert \
-v /home/manager/probject/omc_api/docker/omc/nginx/nginx.conf:/etc/nginx/nginx.conf \
-e TZ="Asia/Shanghai" \
-e APPENV="prod" \
-m 512M \
--name omc \
omc:2.2412.1
```
## 调试
```sh
docker run -it omc:xxx sh
docker exec -it omc:xxx sh
service ssh start && service nginx start && /usr/local/bin/omc --env prod -c /usr/local/etc/omc/omc.yaml
```
## 镜像导出导入
```sh
docker save bitnami/keydb:6.3.4 -o keydb_6.3.4.tar
docker save mariadb:10.6.21 -o mariadb_10.6.21.tar
docker save omc:xx -o omc_xx.tar
docker load -i keydb_6.3.4.tar
docker load -i mariadb_10.6.21.tar
docker load -i omc_xx.tar
sudo bash omc-docker.sh install
mkdir omc-r2.2412.1-ub22-cloud
tar -czvf omc-r2.2412.1-ub22-cloud.tgz omc-r2.2412.1-ub22-cloud/
tar -xzvf omc-r2.2412.1-ub22-cloud.tgz
scp omc_2.2412.1.tar manager@192.168.9.59:/home/manager/omc-r2.2412.1-ub22-cloud/tar/
```

View File

@@ -0,0 +1,158 @@
#!/bin/bash
OMC_CONTAINER_NAME="omc"
MYSQL_CONTAINER_NAME="omc_mysql"
REDIS_CONTAINER_NAME="omc_redis"
# usage
usage() {
echo "Usage: bash omc-docker.sh [install|uninstall|restart|start|stop]"
exit 1
}
# install
install(){
echo "====================== Install container omc service ====================="
echo "Install mysql and redis service program, default N (Y/N):"
read DB_SERVICE
DB_SERVICE=${DB_SERVICE:-"N"}
echo "Select the image in the tar directory (omc_2.2412.1.tar):"
read OMC_FILE
OMC_FILE=${OMC_FILE:-"omc_2.2412.1.tar"}
echo "Container time zone (Asia/Shanghai):"
read OMC_TZ
OMC_TZ=${OMC_TZ:-"Asia/Shanghai"}
echo "Container service http port (80):"
read OMC_HTTP_PORT
OMC_HTTP_PORT=${OMC_HTTP_PORT:-"80"}
echo "Container service https port (443):"
read OMC_HTTPS_PORT
OMC_HTTPS_PORT=${OMC_HTTPS_PORT:-"443"}
echo "Container name ($OMC_CONTAINER_NAME):"
read OMC_CONTAINER_NAME
OMC_CONTAINER_NAME=${OMC_CONTAINER_NAME:-"omc"}
echo "==> Checking Docker version $OMC_CONTAINER_NAME"
sed -i "s/^OMC_CONTAINER_NAME=.*/OMC_CONTAINER_NAME=\"$OMC_CONTAINER_NAME\"/" ./omc-docker.sh
echo "===================== Install container omc service ====================="
echo "==> Checking Docker version"
if sudo docker -v > /dev/null 2>&1; then
sudo docker -v
else
echo "Docker is not available or sudo privileges are not granted."
exit 1
fi
echo "==> Created service network"
NETWORK="omcnet"
if ! docker network ls --filter name=$NETWORK -q | grep -q .; then
docker network create $NETWORK
echo "Network '$NETWORK' created."
else
echo "Network '$NETWORK' already exists."
fi
echo "==> Install service mysql and redis container"
MYSQL_CONTAINER_NAME="omc_mysql"
REDIS_CONTAINER_NAME="omc_redis"
if [[ "$DB_SERVICE" =~ ^[Yy]$ ]]; then
# MySQL Config
mysql_container=$(docker ps --filter "name=$MYSQL_CONTAINER_NAME" --format "{{.Names}}")
if [[ -z "$mysql_container" ]]; then
echo "MySQL container is not running. Installing MySQL container..."
docker load --input $(pwd)/tar/mysql_8.0.39.tar
MYSQL_IMAGE="mysql:8.0.39"
MYSQL_ROOT_PASSWORD="1000omc@kp!"
SQL_FILE_PATH="$(pwd)/sql/install/omc_db.sql"
MYSQL_DATA=/usr/local/etc/$MYSQL_CONTAINER_NAME/data
mkdir -p $MYSQL_DATA
docker run --privileged=true --restart=always -e TZ="$OMC_TZ" \
-e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD \
-v $SQL_FILE_PATH:/docker-entrypoint-initdb.d/database.sql \
-v $MYSQL_DATA:/var/lib/mysql \
--network $NETWORK \
--name $MYSQL_CONTAINER_NAME \
-d $MYSQL_IMAGE
else
echo "MySQL container is already running: $mysql_container"
fi
# Redis Config
redis_container=$(docker ps --filter "name=$REDIS_CONTAINER_NAME" --format "{{.Names}}")
if [[ -z "$redis_container" ]]; then
echo "Redis container is not running. Installing Redis container..."
docker load --input $(pwd)/tar/redis_7.2.5.tar
REDIS_IMAGE="redis:7.2.5"
REDIS_PASSWORD="helloearth"
REDIS_DATA=/usr/local/etc/$REDIS_CONTAINER_NAME/data
mkdir -p $REDIS_DATA
docker run --privileged=true --restart=always -e TZ="$OMC_TZ" \
-e REDIS_PASSWORD=$REDIS_PASSWORD \
-v $REDIS_DATA:/data \
--network $NETWORK \
--name $REDIS_CONTAINER_NAME \
-d $REDIS_IMAGE
else
echo "Redis container is already running: $redis_container"
fi
else
echo "You chose not to install MySQL and Redis containers."
fi
echo "==> Loading service omc container"
docker load --input $(pwd)/tar/$OMC_FILE
if [ ! -d /usr/local/etc/omc ]; then
mkdir -p /usr/local/etc/omc
cp -rf ./omc/* /usr/local/etc/omc
fi
OMC_IMAGE=$(echo "$OMC_FILE" | sed -e 's/_/:/' -e 's/\.tar$//')
docker run --privileged=true --restart=always -m 512M \
-v /usr/local/etc/omc:/usr/local/etc/omc \
-v /usr/local/etc/omc/logs:/var/log \
-v /usr/local/etc/omc/tmp:/tmp/omc \
-v /usr/local/etc/omc/nginx/cert:/etc/nginx/cert \
-v /usr/local/etc/omc/nginx/nginx.conf:/etc/nginx/nginx.conf \
-e TZ=$OMC_TZ \
-p $OMC_HTTP_PORT:80 \
-p $OMC_HTTPS_PORT:443 \
--network $NETWORK \
--name $OMC_CONTAINER_NAME \
-d $OMC_IMAGE
echo "Running service $OMC_CONTAINER_NAME container http port $OMC_HTTP_PORT / https port $OMC_HTTPS_PORT"
}
# uninstall
uninstall(){
docker stop $OMC_CONTAINER_NAME && docker rm $OMC_CONTAINER_NAME
docker stop $REDIS_CONTAINER_NAME && docker rm $REDIS_CONTAINER_NAME
docker stop $MYSQL_CONTAINER_NAME && docker rm $MYSQL_CONTAINER_NAME
}
# According to the input parameters, the corresponding method will be selected for execution, and the instructions will be executed without input.
case "$1" in
"install")
install
;;
"uninstall")
uninstall
;;
"restart")
echo "restart container $OMC_CONTAINER_NAME"
docker restart $OMC_CONTAINER_NAME
;;
"start")
echo "start container $OMC_CONTAINER_NAME"
docker start $OMC_CONTAINER_NAME
;;
"stop")
echo "stop container $OMC_CONTAINER_NAME"
docker stop $OMC_CONTAINER_NAME
;;
*)
usage
;;
esac