| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- 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;'"]
|