更新
已优化至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