From 6ae7bdc8e08647a488659c72f7d5bf826c41f543 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B0=B5=E5=B8=86?= <595835443@qq.com> Date: Tue, 9 Sep 2025 18:02:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=81=97=E6=BC=8F=E7=9A=84?= =?UTF-8?q?=E7=AB=AF=E5=8F=A3=EF=BC=8C=E4=BF=AE=E5=A4=8D=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=BC=96=E7=A0=81=E9=97=AE=E9=A2=98=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=89=93=E5=8C=85=E6=8E=A8=E9=80=81=E8=84=9A=E6=9C=AC=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=B4=E6=98=8E=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/README.md | 10 ++ docker/build.sh | 114 +++++++++++++-------- docker/docker-compose.yml | 2 + docker/nginx/templates/nginx.conf.template | 40 ++++---- 4 files changed, 106 insertions(+), 60 deletions(-) create mode 100644 docker/README.md diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 000000000..a7d0bcd3f --- /dev/null +++ b/docker/README.md @@ -0,0 +1,10 @@ +可以在当前目录下: +使用`docker compose up -d`直接运行。 +使用`docker compose up -d -build -force-recreate`强制重新构建所有服务的镜像并删除旧容器重新运行 + +`.env`用来配置环境变量,在这里配好之后,其它的配置会自动联动的。 + +`build.sh`用来以日期为tag构建镜像,推送到指定的容器注册表内(Windows下可以使用`Git Bash`运行) + + +其它的文件的作用暂不明确 \ No newline at end of file diff --git a/docker/build.sh b/docker/build.sh index 5b1016fc3..5dd3e8e53 100755 --- a/docker/build.sh +++ b/docker/build.sh @@ -1,45 +1,79 @@ -#/bin/bash -set -e +#!/bin/bash -version=2.7.3 +# 获取当前日期作为标签(格式:YYYYMMDD) +date_tag=$(date +%Y%m%d) -git clone https://gitee.com/pan648540858/wvp-GB28181-pro.git -cd wvp-GB28181-pro/web_src && \ - npm install && \ - npm run build +# 切换到脚本所在目录的上一级目录作为工作目录 +cd "$(dirname "$0")/.." || { + echo "错误:无法切换到上级目录" + exit 1 +} +echo "已切换工作目录到:$(pwd)" + +# 检查私有仓库环境变量 +if [ -z "$DOCKER_REGISTRY" ]; then + echo "未设置DOCKER_REGISTRY环境变量" + read -p "请输入私有Docker注册库地址(如不推送请留空): " input_registry + docker_registry="$input_registry" +else + docker_registry="$DOCKER_REGISTRY" +fi + +# 定义要构建的镜像和对应的Dockerfile路径(相对当前工作目录) +images=( + "wvp-service:docker/wvp/Dockerfile" + "wvp-nginx:docker/nginx/Dockerfile" +) + +# 构建镜像的函数 +build_image() { + local image_name="$1" + local dockerfile_path="$2" -cd ../../ -mkdir -p ./nginx/dist -cp -r wvp-GB28181-pro/src/main/resources/static/* ./nginx/dist + # 检查Dockerfile是否存在 + if [ ! -f "$dockerfile_path" ]; then + echo "错误:未找到Dockerfile - \"$dockerfile_path\",跳过构建" + return 1 + fi + + # 构建镜像 + local full_image_name="${image_name}:${date_tag}" + echo + echo "==============================================" + echo "开始构建镜像:${full_image_name}" + echo "Dockerfile路径:${dockerfile_path}" + + docker build -t "${full_image_name}" -f "${dockerfile_path}" . + if [ $? -ne 0 ]; then + echo "镜像${full_image_name}构建失败" + return 1 + fi + + # 推送镜像(如果设置了仓库地址) + if [ -n "$docker_registry" ]; then + local registry_image="${docker_registry}/${full_image_name}" + echo "给镜像打标签:${registry_image}" + docker tag "${full_image_name}" "${registry_image}" + + echo "推送镜像到注册库" + docker push "${registry_image}" + if [ $? -eq 0 ]; then + echo "镜像${registry_image}推送成功" + else + echo "镜像${registry_image}推送失败" + fi + else + echo "未提供注册库地址,不执行推送" + fi + echo "==============================================" + echo +} -echo "构建ZLM容器" -cd ./media/ -chmod +x ./build.sh -./build.sh -cd ../ +# 循环构建所有镜像 +for item in "${images[@]}"; do + IFS=':' read -r image_name dockerfile_path <<< "$item" + build_image "$image_name" "$dockerfile_path" +done -echo "构建数据库容器" -cd ./mysql/ -chmod +x ./build.sh -./build.sh -cd ../ - -echo "构建Redis容器" -cd ./redis/ -chmod +x ./build.sh -./build.sh -cd ../ - -echo "构建WVP容器" -cd ./wvp/ -chmod +x ./build.sh -./build.sh -cd ../ - -echo "构建Nginx容器" -cd ./nginx/ -chmod +x ./build.sh -./build.sh -cd ../ - -./push.sh +echo "所有镜像处理完成" +exit 0 diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 82fa03db0..9758161c0 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -62,8 +62,10 @@ services: #- "6080:80/tcp" # [播流]HTTP 安全考虑-非测试阶段需要注释掉,改为由nginx代理播流地址 #- "4443:443/tcp" # [播流]HTTPS 安全考虑-非测试阶段需要注释掉,改为由nginx代理播流地址 - "${MediaRtmp:-10935}:${MediaRtmp:-10935}/tcp" # [收流]RTMP + - "${MediaRtmp:-10935}:${MediaRtmp:-10935}/udp" # [收流]RTMP #- "41935:41935/tcp" # [收流]RTMPS 无效 - "${MediaRtsp:-5540}:${MediaRtsp:-5540}/tcp" # [收流]RTSP + - "${MediaRtsp:-5540}:${MediaRtsp:-5540}/udp" # [收流]RTSP #- "45540:45540/tcp" # [收流]RTSPS 无效 - "${MediaRtp:-10000}:${MediaRtp:-10000}/tcp" # [收流]RTP - "${MediaRtp:-10000}:${MediaRtp:-10000}/udp" # [收流]RTP diff --git a/docker/nginx/templates/nginx.conf.template b/docker/nginx/templates/nginx.conf.template index b224719e2..cf0de139e 100644 --- a/docker/nginx/templates/nginx.conf.template +++ b/docker/nginx/templates/nginx.conf.template @@ -21,11 +21,11 @@ server { proxy_pass http://polaris-wvp:18978; - # ӻȡԭʼַx.x.x.x + # 从环境变量获取原始主机地址(x.x.x.x) set $original_host ${Stream_IP}; - # ִַ滻 - # ýԴļ滻ΪNginxԵַ + # 执行字符串替换 + # 将媒体资源文件替换为Nginx输出的相对地址 sub_filter "http://$original_host/index/api/downloadFile" "mediaserver/api/downloadFile"; sub_filter "http://$original_host:80/index/api/downloadFile" "mediaserver/api/downloadFile"; sub_filter "https://$original_host/index/api/downloadFile" "mediaserver/api/downloadFile"; @@ -35,69 +35,69 @@ server { sub_filter "https://$original_host/mp4_record" "mp4_record"; sub_filter "https://$original_host:443/mp4_record" "mp4_record"; - # Ϊoffʾ滻ƥǵһ + # 设置为off表示替换所有匹配项,而不仅仅是第一个 sub_filter_once off; - # ȷӦȷ - sub_filter_types application/json; # ֻJSONӦд + # 确保响应被正确处理 + sub_filter_types application/json; # 只对JSON响应进行处理 } - # mediaserver/recordתĿַ + # 将mediaserver/record转发到目标地址 location /mediaserver/api/downloadFile { - # Ŀַ + # 目标服务器地址 proxy_pass http://polaris-media:80/index/api/downloadFile; - # dzõķ + # 以下是常用的反向代理设置 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - # ʱãҪ + # 超时设置,根据需要调整 proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; } - # /rtp/ͷ· + # 仅允许代理/rtp/开头的路径 location ^~ /rtp/ { - # ZLMediakit + # 代理到ZLMediakit服务 proxy_pass http://polaris-media:80; - # HTTP + # 基础HTTP代理配置 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - # WebSocket֧ + # WebSocket支持配置 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; - # ʱãʵ + # 超时设置,根据实际需求调整 proxy_connect_timeout 60s; proxy_read_timeout 3600s; proxy_send_timeout 60s; } - # /rtp/ͷ· + # 仅允许代理/rtp/开头的路径 location ^~ /mp4_record/ { - # ZLMediakit + # 代理到ZLMediakit服务 proxy_pass http://polaris-media:80; - # HTTP + # 基础HTTP代理配置 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - # WebSocket֧ + # WebSocket支持配置 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; - # ʱãʵ + # 超时设置,根据实际需求调整 proxy_connect_timeout 60s; proxy_read_timeout 3600s; proxy_send_timeout 60s;