diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 2ea8bc0..33633a8 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -54,7 +54,7 @@ services: ] polaris-media: - image: ${REGISTRY}zlmediakit/zlmediakit:latest # 替换为官方镜像 + image: ${REGISTRY}polaris-media:latest # 替换为官方镜像 restart: always networks: - media-net diff --git a/docker/media/Dockerfile b/docker/media/Dockerfile index a7b6c16..49e3cae 100644 --- a/docker/media/Dockerfile +++ b/docker/media/Dockerfile @@ -33,8 +33,8 @@ RUN apt-get update && \ RUN mkdir -p /opt/media WORKDIR /opt/media -RUN git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit && \ - cd ZLMediaKit && git submodule update --init +# 使用本地复制的 ZLM 代码(由 build.sh 复制到当前目录) +COPY ZLM /opt/media/ZLMediaKit # 3rdpart init WORKDIR /opt/media/ZLMediaKit/3rdpart diff --git a/docker/media/Dockerfile.registry b/docker/media/Dockerfile.registry new file mode 100644 index 0000000..753639e --- /dev/null +++ b/docker/media/Dockerfile.registry @@ -0,0 +1,89 @@ +FROM registry.t-aaron.com/ubuntu:20.04 AS build + +#shell,rtmp,rtsp,rtsps,http,rtp +EXPOSE 10935/tcp +EXPOSE 5540/tcp +EXPOSE 6080/tcp +EXPOSE 10000/udp +EXPOSE 10000/tcp +EXPOSE 8000/udp +EXPOSE 8000/tcp +EXPOSE 9000/udp + +RUN apt-get update && \ + DEBIAN_FRONTEND="noninteractive" \ + apt-get install -y --no-install-recommends \ + build-essential \ + cmake \ + git \ + curl \ + vim \ + wget \ + ca-certificates \ + tzdata \ + libssl-dev \ + gcc \ + g++ \ + gdb && \ + apt-get autoremove -y && \ + apt-get clean -y && \ + rm -rf /var/lib/apt/lists/* + +RUN mkdir -p /opt/media +WORKDIR /opt/media +# 使用本地 ZLM 代码 +COPY ZLM /opt/media/ZLMediaKit + +# 3rdpart init +WORKDIR /opt/media/ZLMediaKit/3rdpart +RUN wget https://polaris-tian-generic.pkg.coding.net/qt/dependencies/openssl-1.1.1k.tar.gz?version=latest -O openssl-1.1.1k.tar.gz && \ + tar -xvzf openssl-1.1.1k.tar.gz && \ + cd openssl-1.1.1k && ./config shared --openssldir=/usr/local/openssl --prefix=/usr/local/openssl && \ + make && make install && \ + echo "/usr/local/lib64/" >> /etc/ld.so.conf && \ + echo "/usr/local/openssl/lib" >> /etc/ld.so.conf && \ + ldconfig && \ + ln -s /usr/local/openssl/bin/openssl /usr/local/bin/openssl + +WORKDIR /opt/media/ZLMediaKit/3rdpart +RUN wget https://github.com/cisco/libsrtp/archive/v2.3.0.tar.gz -O libsrtp-2.3.0.tar.gz && \ + tar xfv libsrtp-2.3.0.tar.gz && \ + mv libsrtp-2.3.0 libsrtp && \ + cd libsrtp && ./configure --enable-openssl --with-openssl-dir=/usr/local/openssl && make -j $(nproc) && make install + + +WORKDIR /opt/media/ZLMediaKit/build +RUN cmake .. -DENABLE_WEBRTC=true -DOPENSSL_ROOT_DIR=/usr/local/openssl -DOPENSSL_LIBRARIES=/usr/local/openssl/lib && \ + cmake --build . --target MediaServer +COPY docker/media/config.ini /opt/media/ZLMediaKit/release/linux/Debug/ + +FROM registry.t-aaron.com/ubuntu:20.04 + +RUN apt-get update && \ + DEBIAN_FRONTEND="noninteractive" \ + apt-get install -y --no-install-recommends \ + vim \ + wget \ + ca-certificates \ + tzdata \ + curl \ + libssl-dev \ + ffmpeg \ + gcc \ + g++ \ + gdb && \ + apt-get autoremove -y && \ + apt-get clean -y && \ + rm -rf /var/lib/apt/lists/* + +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \ + && echo $TZ > /etc/timezone && \ + mkdir -p /opt/media/bin/www + +WORKDIR /opt/media/bin/ +COPY --from=build /opt/media/ZLMediaKit/release/linux/Debug/MediaServer /opt/media/ZLMediaKit/default.pem /opt/media/bin/ +COPY --from=build /opt/media/ZLMediaKit/release/linux/Debug/config.ini /opt/media/conf/ +COPY --from=build /opt/media/ZLMediaKit/www/ /opt/media/bin/www/ +ENV PATH /opt/media/bin:$PATH +CMD ["./MediaServer","-s", "default.pem", "-c", "../conf/config.ini", "-l","0"] diff --git a/docker/media/build-and-push-media.sh b/docker/media/build-and-push-media.sh new file mode 100755 index 0000000..d8a2422 --- /dev/null +++ b/docker/media/build-and-push-media.sh @@ -0,0 +1,75 @@ +#!/bin/bash + +# 构建并推送 media 镜像到私有仓库 +# 使用方法: 在 docker/media 目录下执行 ./build-and-push-media.sh + +set -e + +# 获取脚本所在目录 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +# 项目根目录(脚本所在目录的上两级) +PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" + +# 配置变量 +REGISTRY="registry.t-aaron.com" +IMAGE_NAME="polaris-media" +VERSION="latest" +PLATFORM="linux/amd64" +DOCKERFILE="Dockerfile.registry" + +# 完整镜像名称 +FULL_IMAGE_NAME="${REGISTRY}/${IMAGE_NAME}:${VERSION}" + +echo "==========================================" +echo "开始构建 ZLMediaKit 镜像" +echo "==========================================" +echo "脚本目录: ${SCRIPT_DIR}" +echo "项目根目录: ${PROJECT_ROOT}" +echo "镜像名称: ${FULL_IMAGE_NAME}" +echo "平台架构: ${PLATFORM}" +echo "Dockerfile: ${SCRIPT_DIR}/${DOCKERFILE}" +echo "==========================================" + +# 检查 Dockerfile 是否存在 +if [ ! -f "${SCRIPT_DIR}/${DOCKERFILE}" ]; then + echo "错误: 未找到 Dockerfile: ${SCRIPT_DIR}/${DOCKERFILE}" + exit 1 +fi + +# 检查 ZLM 目录是否存在 +if [ ! -d "${PROJECT_ROOT}/ZLM" ]; then + echo "错误: ZLM 目录不存在: ${PROJECT_ROOT}/ZLM" + exit 1 +fi + +# 检查 ZLM 源码是否完整 +if [ ! -d "${PROJECT_ROOT}/ZLM/3rdpart/ZLToolKit/src" ]; then + echo "错误: ZLM 源码不完整,请确保 3rdpart 目录下的依赖库存在" + exit 1 +fi + +# 检查 buildx 是否可用 +if ! docker buildx version &> /dev/null; then + echo "错误: docker buildx 不可用" + echo "请先安装 docker buildx" + exit 1 +fi + +# 切换到项目根目录作为构建上下文 +cd "${PROJECT_ROOT}" + +# 构建并推送镜像 +echo "" +echo "开始构建镜像..." +docker buildx build \ + --platform ${PLATFORM} \ + -t ${FULL_IMAGE_NAME} \ + -f docker/media/${DOCKERFILE} \ + --push \ + . + +echo "" +echo "==========================================" +echo "构建完成!" +echo "镜像已推送到: ${FULL_IMAGE_NAME}" +echo "==========================================" diff --git a/docker/media/build.sh b/docker/media/build.sh index edcc16c..57c7117 100755 --- a/docker/media/build.sh +++ b/docker/media/build.sh @@ -1,8 +1,47 @@ -#/bin/bash +#!/bin/bash set -e -version=2.7.3 +version=latest + +# 获取脚本所在目录 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" + +echo "==========================================" +echo "开始构建 ZLMediaKit Docker 镜像" +echo "==========================================" + +# 检查 ZLM 目录是否存在 +if [ ! -d "${PROJECT_ROOT}/ZLM" ]; then + echo "错误: ZLM 目录不存在: ${PROJECT_ROOT}/ZLM" + exit 1 +fi + +# 检查 ZLM 源码是否完整 +if [ ! -d "${PROJECT_ROOT}/ZLM/3rdpart/ZLToolKit/src" ]; then + echo "错误: ZLM 源码不完整,请确保 3rdpart 目录下的依赖库存在" + exit 1 +fi + +# 清理旧的 ZLM 目录(如果存在) +if [ -d "${SCRIPT_DIR}/ZLM" ]; then + echo "清理旧的 ZLM 目录..." + rm -rf "${SCRIPT_DIR}/ZLM" +fi + +# 复制 ZLM 目录到 media 目录 +echo "复制 ZLM 源码到构建目录..." +cp -r "${PROJECT_ROOT}/ZLM" "${SCRIPT_DIR}/ZLM" + +echo "开始构建 Docker 镜像..." docker build -t polaris-media:${version} . -docker tag polaris-media:${version} polaris-tian-docker.pkg.coding.net/qt/polaris/polaris-media:${version} -docker tag polaris-media:${version} polaris-tian-docker.pkg.coding.net/qt/polaris/polaris-media:latest \ No newline at end of file + +# 构建完成后清理 +echo "清理构建目录..." +rm -rf "${SCRIPT_DIR}/ZLM" + +echo "==========================================" +echo "构建完成!" +echo "镜像: polaris-media:${version}" +echo "==========================================" \ No newline at end of file diff --git a/reademe/use.md b/reademe/use.md index e47daec..441f0b6 100644 --- a/reademe/use.md +++ b/reademe/use.md @@ -46,6 +46,23 @@ docker login registry.t-aaron.com 步骤3:推送第三方镜像到私有仓库 +# ===== ubuntu:20.04 ===== +# 备份本地 arm64 镜像 +docker tag ubuntu:20.04 ubuntu:20.04-backup + +# 拉取 amd64 版本 +docker pull --platform linux/amd64 ubuntu:20.04 + +# 推送到私有仓库 +docker tag ubuntu:20.04 registry.t-aaron.com/ubuntu:20.04 +docker push registry.t-aaron.com/ubuntu:20.04 + +# 恢复本地 arm64 版本 +docker rmi ubuntu:20.04 +docker tag ubuntu:20.04-backup ubuntu:20.04 +docker rmi ubuntu:20.04-backup + + # ===== ubuntu:24.04 ===== # 备份本地 arm64 镜像 docker tag ubuntu:24.04 ubuntu:24.04-backup