ARG ALPINE_VERSION=3.18 ARG NGINX_VERSION=1.23.1 ARG NGINX_RTMP_VERSION=1.2.2 ARG FFMPEG_VERSION=5.1 ARG BUILD_CORES ARG MAKEFLAGS="-j${BUILD_CORES:-4}" ARG BUILDTIME=unknown ############################## # Build the NGINX-build image. FROM alpine:${ALPINE_VERSION} AS build-nginx ARG NGINX_VERSION ARG NGINX_RTMP_VERSION ARG MAKEFLAGS # 合并 RUN 命令,优化层数 RUN apk add --no-cache \ build-base \ ca-certificates \ curl \ gcc \ libc-dev \ libgcc \ linux-headers \ make \ musl-dev \ openssl \ openssl-dev \ pcre \ pcre-dev \ pkgconf \ pkgconfig \ zlib-dev \ && mkdir -p /tmp/nginx \ && cd /tmp/nginx \ # 获取并编译 nginx && wget https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz \ && tar zxf nginx-${NGINX_VERSION}.tar.gz \ && rm nginx-${NGINX_VERSION}.tar.gz \ # 获取 nginx-rtmp 模块 && wget https://github.com/arut/nginx-rtmp-module/archive/v${NGINX_RTMP_VERSION}.tar.gz \ && tar zxf v${NGINX_RTMP_VERSION}.tar.gz \ && rm v${NGINX_RTMP_VERSION}.tar.gz \ # nginx && cd /tmp/nginx/nginx-${NGINX_VERSION} \ && ./configure \ --prefix=/usr/local/nginx \ --add-module=/tmp/nginx/nginx-rtmp-module-${NGINX_RTMP_VERSION} \ --conf-path=/etc/nginx/nginx.conf \ --with-threads \ --with-file-aio \ --with-http_ssl_module \ --with-debug \ --with-http_stub_status_module \ --with-cc-opt="-Wimplicit-fallthrough=0" \ && make \ && make install \ # 清理构建文件 && rm -rf /var/cache/* /tmp/* /var/tmp/* ############################### # Build the FFmpeg-build image. FROM alpine:${ALPINE_VERSION} AS build-ffmpeg ARG FFMPEG_VERSION ARG PREFIX=/usr/local ARG MAKEFLAGS # 合并 FFmpeg 构建命令 RUN apk add --no-cache \ build-base \ coreutils \ freetype-dev \ lame-dev \ libogg-dev \ libass \ libass-dev \ libvpx-dev \ libvorbis-dev \ libwebp-dev \ libtheora-dev \ openssl-dev \ opus-dev \ pkgconf \ pkgconfig \ rtmpdump-dev \ wget \ x264-dev \ x265-dev \ yasm \ # 添加 edge 仓库并安装 fdk-aac-dev && echo http://dl-cdn.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories \ && apk add --no-cache fdk-aac-dev \ # 编译 FFmpeg && cd /tmp \ && wget http://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.gz \ && tar zxf ffmpeg-${FFMPEG_VERSION}.tar.gz \ && rm ffmpeg-${FFMPEG_VERSION}.tar.gz \ && cd /tmp/ffmpeg-${FFMPEG_VERSION} \ && ./configure \ --prefix=${PREFIX} \ --enable-version3 \ --enable-gpl \ --enable-nonfree \ --enable-small \ --enable-libmp3lame \ --enable-libx264 \ --enable-libx265 \ --enable-libvpx \ --enable-libtheora \ --enable-libvorbis \ --enable-libopus \ --enable-libfdk-aac \ --enable-libass \ --enable-libwebp \ --enable-postproc \ --enable-libfreetype \ --enable-openssl \ --disable-debug \ --disable-doc \ --disable-ffplay \ --extra-libs="-lpthread -lm" \ && make \ && make install \ && make distclean \ # 清理 && rm -rf /var/cache/* /tmp/* ########################## # Build the release image. FROM alpine:${ALPINE_VERSION} LABEL version="1.0" \ description="NGINX RTMP Server" \ maintainer="zhensolidsl" # 设置环境变量,添加 ffmpeg 路径 ENV HTTP_PORT=80 \ HTTPS_PORT=443 \ RTMP_PORT=1935 \ PATH="/usr/local/bin:${PATH}:/usr/local/nginx/sbin" # 基础包安装 RUN apk update && \ apk add --no-cache \ ca-certificates \ openssl \ pcre # 媒体相关包装 RUN apk add --no-cache \ gettext \ lame \ libogg \ curl \ libass \ libvpx \ libvorbis \ libwebp \ libtheora \ opus # 编码工具安装 RUN apk add --no-cache \ rtmpdump \ x264-dev \ x265-dev \ ffmpeg \ fdk-aac \ fdk-aac-dev # 时区设置 RUN apk add --no-cache tzdata && \ mkdir -p /opt/data /www && \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo "Asia/Shanghai" > /etc/timezone && \ apk del tzdata # 创建必要的目录 RUN mkdir -p /opt/data/hls /www /var/log/nginx # 复制构建产物 COPY --from=build-nginx /usr/local/nginx /usr/local/nginx COPY --from=build-nginx /etc/nginx /etc/nginx COPY --from=build-ffmpeg /usr/local /usr/local COPY --from=build-ffmpeg /usr/lib/libfdk-aac.so.2 /usr/lib/libfdk-aac.so.2 # 复制配置文件和静态文件 COPY nginx.conf /etc/nginx/nginx.conf.template COPY static /www/static # 创建nginx用户和设置权限 RUN addgroup -S nginx && \ adduser -S -G nginx nginx && \ # 设置目录权限 chown -R nginx:nginx /opt/data /www /usr/local/nginx /etc/nginx /var/log/nginx && \ chmod -R 755 /opt/data && \ # 确保 ffmpeg 在正确的位置并有正确的权限 ln -sf /usr/local/bin/ffmpeg /usr/bin/ffmpeg && \ chown root:nginx /usr/local/bin/ffmpeg /usr/bin/ffmpeg && \ chmod 755 /usr/local/bin/ffmpeg /usr/bin/ffmpeg && \ # 设置库文件权限 chown -R root:nginx /usr/local/lib && \ chmod -R 755 /usr/local/lib && \ # 直接添加 nginx 用户到已存在的 video 组 adduser nginx video && \ # 确保日志目录存在并有正确权限 touch /dev/stdout && \ chown nginx:nginx /dev/stdout # 声明数据卷 VOLUME ["/opt/data/hls"] EXPOSE 1935 80 # 添加健康检查 HEALTHCHECK --interval=30s --timeout=3s \ CMD curl -f http://localhost:${HTTP_PORT}/healthcheck || exit 1 CMD ["sh", "-c", "envsubst \"$(env | sed -e 's/=.*//' -e 's/^/\\$/g')\" < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf && nginx -g 'daemon off;'"]