Dockerfile 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. ARG ALPINE_VERSION=3.18
  2. ARG NGINX_VERSION=1.23.1
  3. ARG NGINX_RTMP_VERSION=1.2.2
  4. ARG FFMPEG_VERSION=5.1
  5. ARG BUILD_CORES
  6. ARG MAKEFLAGS="-j${BUILD_CORES:-4}"
  7. ARG BUILDTIME=unknown
  8. ##############################
  9. # Build the NGINX-build image.
  10. FROM alpine:${ALPINE_VERSION} AS build-nginx
  11. ARG NGINX_VERSION
  12. ARG NGINX_RTMP_VERSION
  13. ARG MAKEFLAGS
  14. # 合并 RUN 命令,优化层数
  15. RUN apk add --no-cache \
  16. build-base \
  17. ca-certificates \
  18. curl \
  19. gcc \
  20. libc-dev \
  21. libgcc \
  22. linux-headers \
  23. make \
  24. musl-dev \
  25. openssl \
  26. openssl-dev \
  27. pcre \
  28. pcre-dev \
  29. pkgconf \
  30. pkgconfig \
  31. zlib-dev \
  32. && mkdir -p /tmp/nginx \
  33. && cd /tmp/nginx \
  34. # 获取并编译 nginx
  35. && wget https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz \
  36. && tar zxf nginx-${NGINX_VERSION}.tar.gz \
  37. && rm nginx-${NGINX_VERSION}.tar.gz \
  38. # 获取 nginx-rtmp 模块
  39. && wget https://github.com/arut/nginx-rtmp-module/archive/v${NGINX_RTMP_VERSION}.tar.gz \
  40. && tar zxf v${NGINX_RTMP_VERSION}.tar.gz \
  41. && rm v${NGINX_RTMP_VERSION}.tar.gz \
  42. # nginx
  43. && cd /tmp/nginx/nginx-${NGINX_VERSION} \
  44. && ./configure \
  45. --prefix=/usr/local/nginx \
  46. --add-module=/tmp/nginx/nginx-rtmp-module-${NGINX_RTMP_VERSION} \
  47. --conf-path=/etc/nginx/nginx.conf \
  48. --with-threads \
  49. --with-file-aio \
  50. --with-http_ssl_module \
  51. --with-debug \
  52. --with-http_stub_status_module \
  53. --with-cc-opt="-Wimplicit-fallthrough=0" \
  54. && make \
  55. && make install \
  56. # 清理构建文件
  57. && rm -rf /var/cache/* /tmp/* /var/tmp/*
  58. ###############################
  59. # Build the FFmpeg-build image.
  60. FROM alpine:${ALPINE_VERSION} AS build-ffmpeg
  61. ARG FFMPEG_VERSION
  62. ARG PREFIX=/usr/local
  63. ARG MAKEFLAGS
  64. # 合并 FFmpeg 构建命令
  65. RUN apk add --no-cache \
  66. build-base \
  67. coreutils \
  68. freetype-dev \
  69. lame-dev \
  70. libogg-dev \
  71. libass \
  72. libass-dev \
  73. libvpx-dev \
  74. libvorbis-dev \
  75. libwebp-dev \
  76. libtheora-dev \
  77. openssl-dev \
  78. opus-dev \
  79. pkgconf \
  80. pkgconfig \
  81. rtmpdump-dev \
  82. wget \
  83. x264-dev \
  84. x265-dev \
  85. yasm \
  86. # 添加 edge 仓库并安装 fdk-aac-dev
  87. && echo http://dl-cdn.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories \
  88. && apk add --no-cache fdk-aac-dev \
  89. # 编译 FFmpeg
  90. && cd /tmp \
  91. && wget http://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.gz \
  92. && tar zxf ffmpeg-${FFMPEG_VERSION}.tar.gz \
  93. && rm ffmpeg-${FFMPEG_VERSION}.tar.gz \
  94. && cd /tmp/ffmpeg-${FFMPEG_VERSION} \
  95. && ./configure \
  96. --prefix=${PREFIX} \
  97. --enable-version3 \
  98. --enable-gpl \
  99. --enable-nonfree \
  100. --enable-small \
  101. --enable-libmp3lame \
  102. --enable-libx264 \
  103. --enable-libx265 \
  104. --enable-libvpx \
  105. --enable-libtheora \
  106. --enable-libvorbis \
  107. --enable-libopus \
  108. --enable-libfdk-aac \
  109. --enable-libass \
  110. --enable-libwebp \
  111. --enable-postproc \
  112. --enable-libfreetype \
  113. --enable-openssl \
  114. --disable-debug \
  115. --disable-doc \
  116. --disable-ffplay \
  117. --extra-libs="-lpthread -lm" \
  118. && make \
  119. && make install \
  120. && make distclean \
  121. # 清理
  122. && rm -rf /var/cache/* /tmp/*
  123. ##########################
  124. # Build the release image.
  125. FROM alpine:${ALPINE_VERSION}
  126. LABEL version="1.0" \
  127. description="NGINX RTMP Server" \
  128. maintainer="zhensolidsl"
  129. # 设置环境变量,添加 ffmpeg 路径
  130. ENV HTTP_PORT=80 \
  131. HTTPS_PORT=443 \
  132. RTMP_PORT=1935 \
  133. PATH="/usr/local/bin:${PATH}:/usr/local/nginx/sbin"
  134. # 基础包安装
  135. RUN apk update && \
  136. apk add --no-cache \
  137. ca-certificates \
  138. openssl \
  139. pcre
  140. # 媒体相关包装
  141. RUN apk add --no-cache \
  142. gettext \
  143. lame \
  144. libogg \
  145. curl \
  146. libass \
  147. libvpx \
  148. libvorbis \
  149. libwebp \
  150. libtheora \
  151. opus
  152. # 编码工具安装
  153. RUN apk add --no-cache \
  154. rtmpdump \
  155. x264-dev \
  156. x265-dev \
  157. ffmpeg \
  158. fdk-aac \
  159. fdk-aac-dev
  160. # 时区设置
  161. RUN apk add --no-cache tzdata && \
  162. mkdir -p /opt/data /www && \
  163. cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
  164. echo "Asia/Shanghai" > /etc/timezone && \
  165. apk del tzdata
  166. # 创建必要的目录
  167. RUN mkdir -p /opt/data/hls /www /var/log/nginx
  168. # 复制构建产物
  169. COPY --from=build-nginx /usr/local/nginx /usr/local/nginx
  170. COPY --from=build-nginx /etc/nginx /etc/nginx
  171. COPY --from=build-ffmpeg /usr/local /usr/local
  172. COPY --from=build-ffmpeg /usr/lib/libfdk-aac.so.2 /usr/lib/libfdk-aac.so.2
  173. # 复制配置文件和静态文件
  174. COPY nginx.conf /etc/nginx/nginx.conf.template
  175. COPY static /www/static
  176. # 创建nginx用户和设置权限
  177. RUN addgroup -S nginx && \
  178. adduser -S -G nginx nginx && \
  179. # 设置目录权限
  180. chown -R nginx:nginx /opt/data /www /usr/local/nginx /etc/nginx /var/log/nginx && \
  181. chmod -R 755 /opt/data && \
  182. # 确保 ffmpeg 在正确的位置并有正确的权限
  183. ln -sf /usr/local/bin/ffmpeg /usr/bin/ffmpeg && \
  184. chown root:nginx /usr/local/bin/ffmpeg /usr/bin/ffmpeg && \
  185. chmod 755 /usr/local/bin/ffmpeg /usr/bin/ffmpeg && \
  186. # 设置库文件权限
  187. chown -R root:nginx /usr/local/lib && \
  188. chmod -R 755 /usr/local/lib && \
  189. # 直接添加 nginx 用户到已存在的 video 组
  190. adduser nginx video && \
  191. # 确保日志目录存在并有正确权限
  192. touch /dev/stdout && \
  193. chown nginx:nginx /dev/stdout
  194. # 声明数据卷
  195. VOLUME ["/opt/data/hls"]
  196. EXPOSE 1935 80
  197. # 添加健康检查
  198. HEALTHCHECK --interval=30s --timeout=3s \
  199. CMD curl -f http://localhost:${HTTP_PORT}/healthcheck || exit 1
  200. CMD ["sh", "-c", "envsubst \"$(env | sed -e 's/=.*//' -e 's/^/\\$/g')\" < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf && nginx -g 'daemon off;'"]