快速测试-ZLMediaKit

更新

已优化至https://github.com/zhuyifeiRuichuang/ZLMediaKit

此仓库内置了更完善的GitHub action,可实现自动编译打包代码,自动构建容器镜像,自动部署测试,提供了docker compose和k8s环境标准部署配置,可本地稳定复现部署。可随时同步上游代码更新且稳定制作新版本。支持定制开发后手动触发打包。

注意:

此方法由workbuddy+hy3+专家工具"Dockerfile生成专家" 生成。

项目https://github.com/ZLMediaKit/ZLMediaKit

快速测试打包和部署

使用docker compose环境

bash 复制代码
# 拉取项目代码
git clone https://github.com/ZLMediaKit/ZLMediaKit
# 进入项目目录
cd ZLMediaKit

创建文件Dockerfile

bash 复制代码
# syntax=docker/dockerfile:1
# ============================================================================
# ZLMediaKit 生产级 Dockerfile(多阶段构建)
# 仓库: https://github.com/zhuyifeiRuichuang/ZLMediaKit
#
# 构建说明:
#   1. 主仓库从 GitHub 拉取;子模块(ZLToolKit/media-server/jsoncpp 等)
#      托管在 gitee.com,构建机必须可访问 gitee.com。
#   2. 如需改用「本地源码」构建,把 builder 阶段的 git clone 段替换为:
#        COPY . /src
#      并确保本地已执行 git submodule update --init --recursive。
#   3. 推荐开启 BuildKit:  DOCKER_BUILDKIT=1 docker build ...
# ============================================================================

############################################################
# 阶段一:构建(编译 MediaServer)
############################################################
FROM ubuntu:22.04 AS builder

# ---- 构建参数(可复现 / 可覆盖)----
ARG ZLM_GIT_URL=https://github.com/zhuyifeiRuichuang/ZLMediaKit.git
ARG ZLM_BRANCH=master
ARG ZLM_COMMIT=
ARG CMAKE_BUILD_TYPE=Release
ARG ENABLE_WEBRTC=ON
ARG ENABLE_OPENSSL=ON
ARG ENABLE_MP4=ON
ARG ENABLE_HLS=ON
ARG ENABLE_SRT=ON
ARG ENABLE_API=ON
ARG ENABLE_TESTS=OFF

ENV DEBIAN_FRONTEND=noninteractive

# ---- 构建依赖 ----
# build-essential : gcc/g++/make
# cmake/pkg-config: 构建系统(ubuntu22.04 自带 cmake 3.22,满足 >=3.1.3)
# libssl-dev      : HTTPS/WSS/RTSPS/RTMPS/WebRTC 加密传输
# libsrtp2-dev    : WebRTC 必需的 SRTP 库(项目未内置,必须系统提供,否则 WebRTC 被自动关闭)
# git             : 拉取代码与子模块
# ccache          : 加速重复构建
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
    apt-get update && \
    apt-get install -y --no-install-recommends \
        build-essential \
        cmake \
        pkg-config \
        git \
        ccache \
        libssl-dev \
        libsrtp2-dev && \
    rm -rf /var/lib/apt/lists/*

# 启用 ccache 加速(配合下方 cache mount)
ENV PATH="/usr/lib/ccache:${PATH}" \
    CCACHE_DIR=/root/.ccache

WORKDIR /src

# ---- 拉取源码与子模块 ----
# 注意: 子模块来自 gitee.com,需网络可达
RUN git clone --branch=${ZLM_BRANCH} --single-branch ${ZLM_GIT_URL} . && \
    if [ -n "${ZLM_COMMIT}" ]; then git checkout -q ${ZLM_COMMIT}; fi && \
    git submodule update --init --recursive

# ---- 配置与编译 ----
# 构建产物位于 release/linux/${CMAKE_BUILD_TYPE}/,已包含
# MediaServer、config.ini、www/、default.pem 等运行时所需文件
RUN --mount=type=cache,target=/root/.ccache \
    cmake -S . -B build \
        -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} \
        -DENABLE_WEBRTC=${ENABLE_WEBRTC} \
        -DENABLE_OPENSSL=${ENABLE_OPENSSL} \
        -DENABLE_MP4=${ENABLE_MP4} \
        -DENABLE_HLS=${ENABLE_HLS} \
        -DENABLE_SRT=${ENABLE_SRT} \
        -DENABLE_API=${ENABLE_API} \
        -DENABLE_TESTS=${ENABLE_TESTS} && \
    cmake --build build --target MediaServer -j"$(nproc)"

############################################################
# 阶段二:运行(最小运行时)
############################################################
FROM debian:bookworm-slim AS runtime

ENV DEBIAN_FRONTEND=noninteractive

# ---- 运行时依赖 ----
# libssl3      : OpenSSL(HTTPS/WSS/RTSPS 等)
# libsrtp2-1   : WebRTC SRTP(与构建期 libsrtp2-dev 版本对应)
# ca-certificates: 出站 HTTPS / 可选管理后台
# curl         : 健康检查
# libcap2-bin  : 为二进制赋予绑定特权端口(<1024)的能力,从而可「非 root」运行
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
    apt-get update && \
    apt-get install -y --no-install-recommends \
        libssl3 \
        libsrtp2-1 \
        ca-certificates \
        curl \
        libcap2-bin && \
    rm -rf /var/lib/apt/lists/*

# 创建非 root 用户
RUN groupadd -r zlm && \
    useradd -r -g zlm -s /usr/sbin/nologin -d /opt/zlmediakit zlm

# 拷贝构建产物(二进制 + 配置 + www + 默认证书)
COPY --from=builder /src/release/linux/Release/ /opt/zlmediakit/

WORKDIR /opt/zlmediakit

# 赋予绑定特权端口能力,使非 root 也能监听 80/443/554;
# 随后将目录归属非 root 用户
RUN chown -R zlm:zlm /opt/zlmediakit && \
    setcap 'cap_net_bind_service=+ep' /opt/zlmediakit/MediaServer

USER zlm

# ---- 暴露默认端口 ----
# TCP : HTTP(80) HTTPS(443) RTSP(554) RTMP(1935) RTC(8000) 可选(10000)
# UDP : RTC 媒体(8000) 可选(10000)
# 端口均可在 config.ini 中修改,修改后需同步调整下方 EXPOSE 与容器端口映射
EXPOSE 80/tcp 443/tcp 554/tcp 1935/tcp 8000/tcp 10000/tcp \
       8000/udp 10000/udp

# ---- 健康检查 ----
# 探测内置 HTTP 服务是否就绪(返回任意 HTTP 状态码即视为存活,
# 不依赖 api.secret)。如修改了 HTTP 端口,请同步修改此处地址。
HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \
    CMD curl -s -o /dev/null --max-time 4 http://127.0.0.1/ || exit 1

# 前台运行;可用 -c 指定配置,或用卷挂载覆盖 ./config.ini
# 示例: docker run ... zlmediakit:local -c /opt/zlmediakit/config.ini
ENTRYPOINT ["./MediaServer"]
CMD []

创建文件docker-compose.yml

bash 复制代码
services:
  zlmediakit:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        ZLM_BRANCH: master
        # ZLM_COMMIT: ""        # 如需锁定到特定 commit,取消注释并填入
        ENABLE_WEBRTC: "ON"
    image: zlmediakit:local
    container_name: zlmediakit
    restart: unless-stopped
    ports:
      - "80:80"            # HTTP
      - "443:443"          # HTTPS
      - "554:554"          # RTSP
      - "1935:1935"        # RTMP
      - "8000:8000"        # WebRTC TCP
      - "8000:8000/udp"    # WebRTC UDP
      - "10000:10000"      # 可选业务端口
      - "10000:10000/udp"  # 可选业务端口
    volumes:
      # 挂载自定义配置(推荐):将宿主机 config.ini 覆盖容器内配置
      - ./config.ini:/opt/zlmediakit/config.ini:ro
      # 持久化录像/截图等写目录(按需,注意路径需与 config.ini 中配置一致)
      # - ./record:/opt/zlmediakit/www/record
    healthcheck:
      test: ["CMD", "curl", "-fsS", "-o", "/dev/null", "http://127.0.0.1/"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 15s

部署并自动构建

bash 复制代码
docker compose up -d
相关推荐
小田学Python3 小时前
工具调用:让 Agent 从“说”到“做”
大数据·大模型·agent·ai工具·deepseek
GrowingIO技术社区8 小时前
用户行为分析怎么做?从业务目标到改进验证的完整流程
大数据·数据挖掘·数据分析
瑞克-桑切斯11 小时前
docker Harbor 单机部署手册
大数据·运维·elasticsearch·docker·容器
演艺大赏13 小时前
NiFi 起不来、登不上、节点被挤掉:一份按日志定位的排错清单
大数据
freejackman13 小时前
【实战三】撕开脱敏盲区:深度解析 CASE WHEN 与窗口函数血缘
大数据·数据库·sql
wafrdggh1 天前
2026电商快递批量查询怎么用?固乔助手模板设置评测
大数据·数据库·小程序
大大大大晴天1 天前
OLTP、OLAP、数据湖、数据集市、湖仓一体到底是什么关系?
大数据
正在走向自律1 天前
AI Agent 落地这一年:从“能跑起来”到“敢放出去”
大数据·人工智能·ai agent·智能体·mcp·a2a
freejackman1 天前
【实战二】字段级血缘追踪:拆解 AST 迷局,精准穿透函数链与子查询
大数据·数据库·sql
goujunwe1 天前
GEO 内容的“可摘录性”打磨技巧:段落、表格、小标题怎么写,方便大模型提取独立答案块
大数据·人工智能