From 9d1bee99ab6219c41a60512b89f1c54b76cefe37 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 1 Nov 2024 16:47:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20dockerfile=E6=96=87=E4=BB=B6=E7=BC=96?= =?UTF-8?q?=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/Dockerfile | 113 +++++++++++++++++++++------------------ docker/Dockerfile.golang | 46 ++++++++++++++++ docker/README.md | 60 +++++++++++++-------- 3 files changed, 146 insertions(+), 73 deletions(-) create mode 100644 docker/Dockerfile.golang diff --git a/docker/Dockerfile b/docker/Dockerfile index 3387b3e..27cfd9a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,73 +1,82 @@ ## 第一阶段 ====> Nodejs打包编译输出前端资源 -FROM node:18-alpine AS build-nodejs - -## 工作目录存放程序源码 -WORKDIR /frontend - -## 复制实际需要的文件到工作目录 -COPY ./frontend ./ +FROM node:20-alpine AS build-node +# 前端程序 +COPY ./omc_web /web RUN npm config set registry https://registry.npmmirror.com -RUN cd /frontend && npm install && npm run build +RUN cd /web && npm install && npm run build +RUN touch /web/dist/config.js && echo '/*use nginx*/' | tee /web/dist/config.js -## 第二阶段 ====> GO打包编译输出后端程序 -FROM golang:alpine AS build-go +# 后端程序 +# COPY ./omc_api /api +COPY ./omc_api/restagent/config /api/restagent/config +COPY ./omc_api/restagent/etc/restconf.yaml /api/restagent/etc/restconf.yaml +COPY ./omc_api/restagent/restagent.go /api/restagent/restagent.go +COPY ./omc_api/features /api/features +COPY ./omc_api/lib /api/lib +COPY ./omc_api/src /api/src +COPY ./omc_api/go.sum /api/go.sum +COPY ./omc_api/go.mod /api/go.mod + +# Docker文件 +COPY ./omc_api/docker/omc /docker + + +## 第二阶段 ====> Go打包编译输出后端程序 +FROM golang:1.22-alpine AS build-golang + +# 从上个阶段复制过来的文件 +COPY --from=build-node /web/dist /frontend +COPY --from=build-node /api /backend +COPY --from=build-node /docker /docker ARG VERSION - -ENV CGO_ENABLED 0 +ENV CGO_ENABLED 1 ENV GOOS linux ENV GOPROXY https://goproxy.cn,direct -WORKDIR /backend - -## 复制实际需要的文件到工作目录 -COPY ./backend/docker ./docker -COPY ./backend/restagent/config ./restagent/config -COPY ./backend/restagent/etc ./restagent/etc -COPY ./backend/restagent/restagent.go ./restagent/restagent.go -COPY ./backend/features ./features -COPY ./backend/lib ./lib -COPY ./backend/src ./src -COPY ./backend/go.sum ./ -COPY ./backend/go.mod ./ - +## 安装打包必要依赖 +RUN apk add gcc musl-dev libpcap-dev RUN cd /backend && go mod download -RUN cd /backend/restagent && go build -o backend -v -ldflags "-X 'ems.agt/lib/global.Version=${VERSION}' -X 'ems.agt/lib/global.BuildTime=`date`' -X 'ems.agt/lib/global.GoVer=`go version`'" -# RUN cd /backend/restagent && go build -ldflags="-s -w" -o backend +RUN cd /backend/restagent && go build -o omc -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 alpine +## 第三阶段 ====> 构建前后端融合镜像 +FROM alpine:3.20 -## 安装工具 -RUN apk add --no-cache tzdata nginx openssh \ - && ssh-keygen -A \ - && adduser -D omc \ - && echo 'omc:password' | chpasswd \ - && mkdir /home/omc/.ssh \ - && chmod 700 /home/omc/.ssh +## 安装时区工具 +RUN apk add --no-cache tzdata nginx libpcap-dev openssh && \ + ssh-keygen -A && \ + adduser -D omcuser && \ + echo 'omcuser:password' | chpasswd && \ + mkdir -p /home/omcuser/.ssh && \ + chmod 700 /home/omcuser/.ssh && \ + touch /home/omcuser/.ssh/authorized_keys && \ + chmod 600 /home/omcuser/.ssh/authorized_keys && \ + chown -R omcuser:omcuser /home/omcuser/.ssh # 设置时区和语言环境 ENV TZ="Asia/Shanghai" ENV LANG="en_US.UTF-8" -# 运行环境 ENV APPENV="prod" -WORKDIR /usr/local/omc +WORKDIR /usr/local/etc/omc +COPY --from=build-golang /frontend ./frontend +COPY --from=build-golang /backend/restagent/omc /usr/local/bin/omc +COPY --from=build-golang /docker/etc/omc.yaml ./omc.yaml +COPY --from=build-golang /docker/static ./static +COPY --from=build-golang /docker/logs /var/log/omc +COPY --from=build-golang /docker/nginx/cert /etc/nginx/cert +COPY --from=build-golang /docker/nginx/nginx.conf /etc/nginx/nginx.conf -# 前端编译 -COPY --from=build-nodejs /frontend/dist /usr/local/bin/omc-frontend -RUN touch /usr/local/bin/omc-frontend/config.js +EXPOSE 33030 33033 33040 33060 80 22 -# 后端编译 -COPY --from=build-go /backend/restagent/backend /usr/local/bin/omc-backend +CMD ["/usr/sbin/sshd -D &", ";", "nginx", ";", "/usr/local/bin/omc", "--env", "${APPENV}", "-c", "/usr/local/etc/omc/omc.yaml"] +# CMD ["/usr/sbin/sshd", "-D", "&", ";", "nginx", ";", "/usr/local/bin/omc", "--env", "${APPENV}", "-c", "/usr/local/etc/omc/omc.yaml"] -# 其余文件 -COPY ./backend/docker/omc ./ -RUN mkdir -p /var/log/omc && mkdir /var/log/omc/nginx -RUN touch /var/log/omc/nginx/error.log -RUN touch /var/log/omc/nginx/access.log - -EXPOSE 22 80 3030 6060 - -CMD ["/bin/sh", "-c", "/usr/sbin/sshd && nginx -c /usr/local/omc/nginx/nginx.conf && /usr/local/bin/omc-backend --env ${APPENV} -c /usr/local/omc/etc/omc.yaml"] +# 构建 +# docker build --build-arg VERSION=241101 -t omc:2.241101 . +# docker run -it omc:2.241101 sh +# /usr/sbin/sshd -D & ; nginx ; /usr/local/bin/omc --env prod -c /usr/local/etc/omc/omc.yaml diff --git a/docker/Dockerfile.golang b/docker/Dockerfile.golang new file mode 100644 index 0000000..519fd11 --- /dev/null +++ b/docker/Dockerfile.golang @@ -0,0 +1,46 @@ +FROM golang:1.22-alpine AS buildGo + +ARG VERSION + +ENV CGO_ENABLED 1 +ENV GOOS linux +ENV GOPROXY https://goproxy.cn,direct + +## 安装时区工具 +RUN apk add --no-cache gcc musl-dev libpcap-dev tzdata openssh \ + && ssh-keygen -A \ + && adduser -D omcuser \ + && echo 'omcuser:password' | chpasswd \ + && mkdir /home/omcuser/.ssh \ + && chmod 700 /home/omcuser/.ssh + +# 设置时区和语言环境 +ENV TZ="Asia/Shanghai" +ENV LANG="en_US.UTF-8" + +WORKDIR /backend + +## 复制实际需要的文件到工作目录 +COPY ./restagent/config ./restagent/config +COPY ./restagent/etc ./restagent/etc +COPY ./restagent/restagent.go ./restagent/restagent.go +COPY ./features ./features +COPY ./lib ./lib +COPY ./src ./src +COPY ./go.sum ./ +COPY ./go.mod ./ + +RUN cd /backend && go mod download +RUN cd /backend/restagent && go build -o omc_api -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`'" + +EXPOSE 33030 33033 33040 80 22 + +CMD [ "/backend/restagent/omc_api", "--env", "prod", "-c", "/backend/restagent/etc/restconf.yaml"] + +# 构建 +# docker build --build-arg VERSION=241031 -t omc:2.241031 . +# docker run -it omc:2.241031 sh +# /backend/restagent/omc_api --env prod -c /backend/restagent/etc/restconf.yaml \ No newline at end of file diff --git a/docker/README.md b/docker/README.md index a6ca53c..3840b6f 100644 --- a/docker/README.md +++ b/docker/README.md @@ -1,23 +1,38 @@ # Docker 编译 -编译目录内含 `frontend` 和 `backend` 两个项目代码,将后端项目代码中的 `backend/docker/Dockerfile` 文件移动到最外层目录下。 +编译目录内含 `omc_web` 和 `omc_api` 两个项目代码 + +将后端项目代码中的 `docker/Dockerfile` 文件移动到最外层目录下,`docker/omc`是内部文件挂载的文件资源。 编译目录结构 ```text -omc -├── frontend 目录-前端项目代码 -├── backend 目录-后端项目代码 +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 | 存放从网元拉取到本地的文件 | + +## 编译 - `VERSION` 变量是后端程序打包版本号注入 ```sh -docker build --build-arg VERSION="2.240112" -t omc:2.240112 . +docker build --build-arg VERSION="2.241101" -t omc:2.241101 . ``` @@ -30,37 +45,40 @@ docker build --build-arg VERSION="2.240112" -t omc:2.240112 . docker run -d \ --privileged=true \ --restart=always \ --p 3222:22 \ --p 3280:80 \ --p 3230:3030 \ --p 3260:6060 \ --v /home/mask/Probject/omc/omc:/usr/local/omc \ --v /home/mask/Probject/omc/logs:/var/log/omc \ +-p 8822:22 \ +-p 8880:80 \ +-p 8830:33030 \ +-p 8833:33033 \ +-p 8840:33040 \ +-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/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="local" \ -m 512M \ ---name omc_002 \ -omc:2.240112 - +--name omc2.241101 \ +omc:2.241101 ``` ## 镜像导出导入 ```sh -docker save omc:2.240112 -o omc_r2.240112.tar +docker save omc:2.241101 -o omc_r2.241101.tar -docker load -i omc_r2.240112.tar +docker load -i omc_r2.241101.tar ``` ## 调试 ```sh -docker run -it omcxxx sh +docker run -it omc:xxx sh -docker exec -it omxxx sh +docker exec -it omc:xxx sh - -/usr/sbin/sshd && nginx -c /usr/local/omc/nginx/nginx.conf && /usr/local/omc/bin/backend --env prod -c /usr/local/omc/etc/omc.yaml +/usr/sbin/sshd -D && nginx -c /etc/nginx/nginx.conf && /usr/local/bin/omc --env prod -c /usr/local/etc/omc/omc.yaml ```