├── Dockerfile ├── README.md └── onbuild └── Dockerfile /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.8 AS build 2 | 3 | RUN apk add --no-cache --update libgcc libstdc++ ca-certificates libcrypto1.0 libssl1.0 libgomp expat git 4 | WORKDIR /tmp/workdir 5 | 6 | ARG PKG_CONFIG_PATH=/opt/ffmpeg/lib/pkgconfig 7 | ARG LD_LIBRARY_PATH=/opt/ffmpeg/lib 8 | ARG PREFIX=/opt/ffmpeg 9 | ARG MAKEFLAGS="-j2" 10 | 11 | ENV FFMPEG_VERSION=4.2.1 \ 12 | AOM_VERSION=v1.0.0 \ 13 | FDKAAC_VERSION=0.1.5 \ 14 | FONTCONFIG_VERSION=2.12.4 \ 15 | FREETYPE_VERSION=2.5.5 \ 16 | FRIBIDI_VERSION=0.19.7 \ 17 | KVAZAAR_VERSION=1.2.0 \ 18 | LAME_VERSION=3.100 \ 19 | LIBASS_VERSION=0.13.7 \ 20 | LIBVIDSTAB_VERSION=1.1.0 \ 21 | OGG_VERSION=1.3.2 \ 22 | OPENCOREAMR_VERSION=0.1.5 \ 23 | OPUS_VERSION=1.2 \ 24 | OPENJPEG_VERSION=2.1.2 \ 25 | THEORA_VERSION=1.1.1 \ 26 | VORBIS_VERSION=1.3.5 \ 27 | VPX_VERSION=1.8.0 \ 28 | WEBP_VERSION=1.0.2 \ 29 | X264_VERSION=20170226-2245-stable \ 30 | X265_VERSION=3.1.1 \ 31 | XVID_VERSION=1.3.4 \ 32 | SRC=/usr/local 33 | 34 | ARG FREETYPE_SHA256SUM="5d03dd76c2171a7601e9ce10551d52d4471cf92cd205948e60289251daddffa8 freetype-2.5.5.tar.gz" 35 | ARG FRIBIDI_SHA256SUM="3fc96fa9473bd31dcb5500bdf1aa78b337ba13eb8c301e7c28923fea982453a8 0.19.7.tar.gz" 36 | ARG LIBASS_SHA256SUM="8fadf294bf701300d4605e6f1d92929304187fca4b8d8a47889315526adbafd7 0.13.7.tar.gz" 37 | ARG LIBVIDSTAB_SHA256SUM="14d2a053e56edad4f397be0cb3ef8eb1ec3150404ce99a426c4eb641861dc0bb v1.1.0.tar.gz" 38 | ARG OGG_SHA256SUM="e19ee34711d7af328cb26287f4137e70630e7261b17cbe3cd41011d73a654692 libogg-1.3.2.tar.gz" 39 | ARG OPUS_SHA256SUM="77db45a87b51578fbc49555ef1b10926179861d854eb2613207dc79d9ec0a9a9 opus-1.2.tar.gz" 40 | ARG THEORA_SHA256SUM="40952956c47811928d1e7922cda3bc1f427eb75680c3c37249c91e949054916b libtheora-1.1.1.tar.gz" 41 | ARG VORBIS_SHA256SUM="6efbcecdd3e5dfbf090341b485da9d176eb250d893e3eb378c428a2db38301ce libvorbis-1.3.5.tar.gz" 42 | ARG XVID_SHA256SUM="4e9fd62728885855bc5007fe1be58df42e5e274497591fec37249e1052ae316f xvidcore-1.3.4.tar.gz" 43 | 44 | RUN buildDeps="autoconf \ 45 | automake \ 46 | bash \ 47 | binutils \ 48 | bzip2 \ 49 | cmake \ 50 | curl \ 51 | coreutils \ 52 | diffutils \ 53 | file \ 54 | g++ \ 55 | gcc \ 56 | gperf \ 57 | libtool \ 58 | make \ 59 | python \ 60 | openssl-dev \ 61 | tar \ 62 | yasm \ 63 | nasm \ 64 | zlib-dev \ 65 | expat-dev" && \ 66 | apk add --no-cache --update ${buildDeps} 67 | ## opencore-amr https://sourceforge.net/projects/opencore-amr/ 68 | RUN \ 69 | DIR=/tmp/opencore-amr && \ 70 | mkdir -p ${DIR} && \ 71 | cd ${DIR} && \ 72 | curl -sL https://versaweb.dl.sourceforge.net/project/opencore-amr/opencore-amr/opencore-amr-${OPENCOREAMR_VERSION}.tar.gz | \ 73 | tar -zx --strip-components=1 && \ 74 | ./configure --prefix="${PREFIX}" --enable-shared && \ 75 | make && \ 76 | make install && \ 77 | rm -rf ${DIR} 78 | ## x264 http://www.videolan.org/developers/x264.html 79 | RUN \ 80 | DIR=/tmp/x264 && \ 81 | mkdir -p ${DIR} && \ 82 | cd ${DIR} && \ 83 | curl -sL https://download.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-${X264_VERSION}.tar.bz2 | \ 84 | tar -jx --strip-components=1 && \ 85 | ./configure --prefix="${PREFIX}" --enable-shared --enable-pic --disable-cli && \ 86 | make && \ 87 | make install && \ 88 | rm -rf ${DIR} 89 | ### x265 http://x265.org/ 90 | RUN \ 91 | DIR=/tmp/x265 && \ 92 | mkdir -p ${DIR} && \ 93 | cd ${DIR} && \ 94 | curl -sL https://download.videolan.org/pub/videolan/x265/x265_${X265_VERSION}.tar.gz | \ 95 | tar -zx && \ 96 | cd x265_${X265_VERSION}/build/linux && \ 97 | sed -i "/-DEXTRA_LIB/ s/$/ -DCMAKE_INSTALL_PREFIX=\${PREFIX}/" multilib.sh && \ 98 | sed -i "/^cmake/ s/$/ -DENABLE_CLI=OFF/" multilib.sh && \ 99 | ./multilib.sh && \ 100 | make -C 8bit install && \ 101 | rm -rf ${DIR} 102 | ### libogg https://www.xiph.org/ogg/ 103 | RUN \ 104 | DIR=/tmp/ogg && \ 105 | mkdir -p ${DIR} && \ 106 | cd ${DIR} && \ 107 | curl -sLO http://downloads.xiph.org/releases/ogg/libogg-${OGG_VERSION}.tar.gz && \ 108 | echo ${OGG_SHA256SUM} | sha256sum --check && \ 109 | tar -zx --strip-components=1 -f libogg-${OGG_VERSION}.tar.gz && \ 110 | ./configure --prefix="${PREFIX}" --enable-shared && \ 111 | make && \ 112 | make install && \ 113 | rm -rf ${DIR} 114 | ### libopus https://www.opus-codec.org/ 115 | RUN \ 116 | DIR=/tmp/opus && \ 117 | mkdir -p ${DIR} && \ 118 | cd ${DIR} && \ 119 | curl -sLO https://archive.mozilla.org/pub/opus/opus-${OPUS_VERSION}.tar.gz && \ 120 | echo ${OPUS_SHA256SUM} | sha256sum --check && \ 121 | tar -zx --strip-components=1 -f opus-${OPUS_VERSION}.tar.gz && \ 122 | autoreconf -fiv && \ 123 | ./configure --prefix="${PREFIX}" --enable-shared && \ 124 | make && \ 125 | make install && \ 126 | rm -rf ${DIR} 127 | ### libvorbis https://xiph.org/vorbis/ 128 | RUN \ 129 | DIR=/tmp/vorbis && \ 130 | mkdir -p ${DIR} && \ 131 | cd ${DIR} && \ 132 | curl -sLO http://downloads.xiph.org/releases/vorbis/libvorbis-${VORBIS_VERSION}.tar.gz && \ 133 | echo ${VORBIS_SHA256SUM} | sha256sum --check && \ 134 | tar -zx --strip-components=1 -f libvorbis-${VORBIS_VERSION}.tar.gz && \ 135 | ./configure --prefix="${PREFIX}" --with-ogg="${PREFIX}" --enable-shared && \ 136 | make && \ 137 | make install && \ 138 | rm -rf ${DIR} 139 | ### libtheora http://www.theora.org/ 140 | RUN \ 141 | DIR=/tmp/theora && \ 142 | mkdir -p ${DIR} && \ 143 | cd ${DIR} && \ 144 | curl -sLO http://downloads.xiph.org/releases/theora/libtheora-${THEORA_VERSION}.tar.gz && \ 145 | echo ${THEORA_SHA256SUM} | sha256sum --check && \ 146 | tar -zx --strip-components=1 -f libtheora-${THEORA_VERSION}.tar.gz && \ 147 | ./configure --prefix="${PREFIX}" --with-ogg="${PREFIX}" --enable-shared && \ 148 | make && \ 149 | make install && \ 150 | rm -rf ${DIR} 151 | ### libvpx https://www.webmproject.org/code/ 152 | RUN \ 153 | DIR=/tmp/vpx && \ 154 | mkdir -p ${DIR} && \ 155 | cd ${DIR} && \ 156 | curl -sL https://codeload.github.com/webmproject/libvpx/tar.gz/v${VPX_VERSION} | \ 157 | tar -zx --strip-components=1 && \ 158 | ./configure --prefix="${PREFIX}" --enable-vp8 --enable-vp9 --enable-vp9-highbitdepth --enable-pic --enable-shared \ 159 | --disable-debug --disable-examples --disable-docs --disable-install-bins && \ 160 | make && \ 161 | make install && \ 162 | rm -rf ${DIR} 163 | ### libwebp https://developers.google.com/speed/webp/ 164 | RUN \ 165 | DIR=/tmp/vebp && \ 166 | mkdir -p ${DIR} && \ 167 | cd ${DIR} && \ 168 | curl -sL https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-${WEBP_VERSION}.tar.gz | \ 169 | tar -zx --strip-components=1 && \ 170 | ./configure --prefix="${PREFIX}" --enable-shared && \ 171 | make && \ 172 | make install && \ 173 | rm -rf ${DIR} 174 | ### libmp3lame http://lame.sourceforge.net/ 175 | RUN \ 176 | DIR=/tmp/lame && \ 177 | mkdir -p ${DIR} && \ 178 | cd ${DIR} && \ 179 | curl -sL https://versaweb.dl.sourceforge.net/project/lame/lame/$(echo ${LAME_VERSION} | sed -e 's/[^0-9]*\([0-9]*\)[.]\([0-9]*\)[.]\([0-9]*\)\([0-9A-Za-z-]*\)/\1.\2/')/lame-${LAME_VERSION}.tar.gz | \ 180 | tar -zx --strip-components=1 && \ 181 | ./configure --prefix="${PREFIX}" --bindir="${PREFIX}/bin" --enable-shared --enable-nasm --enable-pic --disable-frontend && \ 182 | make && \ 183 | make install && \ 184 | rm -rf ${DIR} 185 | ### xvid https://www.xvid.com/ 186 | RUN \ 187 | DIR=/tmp/xvid && \ 188 | mkdir -p ${DIR} && \ 189 | cd ${DIR} && \ 190 | curl -sLO http://downloads.xvid.org/downloads/xvidcore-${XVID_VERSION}.tar.gz && \ 191 | echo ${XVID_SHA256SUM} | sha256sum --check && \ 192 | tar -zx -f xvidcore-${XVID_VERSION}.tar.gz && \ 193 | cd xvidcore/build/generic && \ 194 | ./configure --prefix="${PREFIX}" --bindir="${PREFIX}/bin" --datadir="${DIR}" --enable-shared --enable-shared && \ 195 | make && \ 196 | make install && \ 197 | rm -rf ${DIR} 198 | ### fdk-aac https://github.com/mstorsjo/fdk-aac 199 | RUN \ 200 | DIR=/tmp/fdk-aac && \ 201 | mkdir -p ${DIR} && \ 202 | cd ${DIR} && \ 203 | curl -sL https://github.com/mstorsjo/fdk-aac/archive/v${FDKAAC_VERSION}.tar.gz | \ 204 | tar -zx --strip-components=1 && \ 205 | autoreconf -fiv && \ 206 | ./configure --prefix="${PREFIX}" --enable-shared --datadir="${DIR}" && \ 207 | make && \ 208 | make install && \ 209 | rm -rf ${DIR} 210 | ## openjpeg https://github.com/uclouvain/openjpeg 211 | RUN \ 212 | DIR=/tmp/openjpeg && \ 213 | mkdir -p ${DIR} && \ 214 | cd ${DIR} && \ 215 | curl -sL https://github.com/uclouvain/openjpeg/archive/v${OPENJPEG_VERSION}.tar.gz | \ 216 | tar -zx --strip-components=1 && \ 217 | cmake -DBUILD_THIRDPARTY:BOOL=ON -DCMAKE_INSTALL_PREFIX="${PREFIX}" . && \ 218 | make && \ 219 | make install && \ 220 | rm -rf ${DIR} 221 | ## freetype https://www.freetype.org/ 222 | RUN \ 223 | DIR=/tmp/freetype && \ 224 | mkdir -p ${DIR} && \ 225 | cd ${DIR} && \ 226 | curl -sLO https://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPE_VERSION}.tar.gz && \ 227 | echo ${FREETYPE_SHA256SUM} | sha256sum --check && \ 228 | tar -zx --strip-components=1 -f freetype-${FREETYPE_VERSION}.tar.gz && \ 229 | ./configure --prefix="${PREFIX}" --disable-static --enable-shared && \ 230 | make && \ 231 | make install && \ 232 | rm -rf ${DIR} 233 | ## libvstab https://github.com/georgmartius/vid.stab 234 | RUN \ 235 | DIR=/tmp/vid.stab && \ 236 | mkdir -p ${DIR} && \ 237 | cd ${DIR} && \ 238 | curl -sLO https://github.com/georgmartius/vid.stab/archive/v${LIBVIDSTAB_VERSION}.tar.gz &&\ 239 | echo ${LIBVIDSTAB_SHA256SUM} | sha256sum --check && \ 240 | tar -zx --strip-components=1 -f v${LIBVIDSTAB_VERSION}.tar.gz && \ 241 | cmake -DCMAKE_INSTALL_PREFIX="${PREFIX}" . && \ 242 | make && \ 243 | make install && \ 244 | rm -rf ${DIR} 245 | ## fridibi https://www.fribidi.org/ 246 | # + https://github.com/fribidi/fribidi/issues/8 247 | RUN \ 248 | DIR=/tmp/fribidi && \ 249 | mkdir -p ${DIR} && \ 250 | cd ${DIR} && \ 251 | curl -sLO https://github.com/fribidi/fribidi/archive/${FRIBIDI_VERSION}.tar.gz && \ 252 | echo ${FRIBIDI_SHA256SUM} | sha256sum --check && \ 253 | tar -zx --strip-components=1 -f ${FRIBIDI_VERSION}.tar.gz && \ 254 | sed -i 's/^SUBDIRS =.*/SUBDIRS=gen.tab charset lib/' Makefile.am && \ 255 | ./bootstrap --no-config && \ 256 | ./configure -prefix="${PREFIX}" --disable-static --enable-shared && \ 257 | make -j 1 && \ 258 | make install && \ 259 | rm -rf ${DIR} 260 | ## fontconfig https://www.freedesktop.org/wiki/Software/fontconfig/ 261 | RUN \ 262 | DIR=/tmp/fontconfig && \ 263 | mkdir -p ${DIR} && \ 264 | cd ${DIR} && \ 265 | curl -sLO https://www.freedesktop.org/software/fontconfig/release/fontconfig-${FONTCONFIG_VERSION}.tar.bz2 &&\ 266 | tar -jx --strip-components=1 -f fontconfig-${FONTCONFIG_VERSION}.tar.bz2 && \ 267 | ./configure -prefix="${PREFIX}" --disable-static --enable-shared && \ 268 | make && \ 269 | make install && \ 270 | rm -rf ${DIR} 271 | ## libass https://github.com/libass/libass 272 | RUN \ 273 | DIR=/tmp/libass && \ 274 | mkdir -p ${DIR} && \ 275 | cd ${DIR} && \ 276 | curl -sLO https://github.com/libass/libass/archive/${LIBASS_VERSION}.tar.gz &&\ 277 | echo ${LIBASS_SHA256SUM} | sha256sum --check && \ 278 | tar -zx --strip-components=1 -f ${LIBASS_VERSION}.tar.gz && \ 279 | ./autogen.sh && \ 280 | ./configure -prefix="${PREFIX}" --disable-static --enable-shared && \ 281 | make && \ 282 | make install && \ 283 | rm -rf ${DIR} 284 | ## kvazaar https://github.com/ultravideo/kvazaar 285 | RUN \ 286 | DIR=/tmp/kvazaar && \ 287 | mkdir -p ${DIR} && \ 288 | cd ${DIR} && \ 289 | curl -sLO https://github.com/ultravideo/kvazaar/archive/v${KVAZAAR_VERSION}.tar.gz &&\ 290 | tar -zx --strip-components=1 -f v${KVAZAAR_VERSION}.tar.gz && \ 291 | ./autogen.sh && \ 292 | ./configure -prefix="${PREFIX}" --disable-static --enable-shared && \ 293 | make && \ 294 | make install && \ 295 | rm -rf ${DIR} 296 | 297 | RUN \ 298 | DIR=/tmp/aom && \ 299 | git clone --branch ${AOM_VERSION} --depth 1 https://aomedia.googlesource.com/aom ${DIR} ; \ 300 | cd ${DIR} ; \ 301 | rm -rf CMakeCache.txt CMakeFiles ; \ 302 | mkdir -p ./aom_build ; \ 303 | cd ./aom_build ; \ 304 | cmake -DCMAKE_INSTALL_PREFIX="${PREFIX}" -DBUILD_SHARED_LIBS=1 ..; \ 305 | make ; \ 306 | make install ; \ 307 | rm -rf ${DIR} 308 | 309 | ## ffmpeg https://ffmpeg.org/ 310 | RUN \ 311 | DIR=/tmp/ffmpeg && mkdir -p ${DIR} && cd ${DIR} && \ 312 | curl -sLO https://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.bz2 && \ 313 | tar -jx --strip-components=1 -f ffmpeg-${FFMPEG_VERSION}.tar.bz2 314 | 315 | RUN \ 316 | DIR=/tmp/ffmpeg && mkdir -p ${DIR} && cd ${DIR} && \ 317 | ./configure \ 318 | --disable-debug \ 319 | --disable-doc \ 320 | --disable-ffplay \ 321 | --enable-shared \ 322 | --enable-avresample \ 323 | --enable-libopencore-amrnb \ 324 | --enable-libopencore-amrwb \ 325 | --enable-gpl \ 326 | --enable-libass \ 327 | --enable-libfreetype \ 328 | --enable-libvidstab \ 329 | --enable-libmp3lame \ 330 | --enable-libopenjpeg \ 331 | --enable-libopus \ 332 | --enable-libtheora \ 333 | --enable-libvorbis \ 334 | --enable-libvpx \ 335 | --enable-libwebp \ 336 | --enable-libx265 \ 337 | --enable-libxvid \ 338 | --enable-libx264 \ 339 | --enable-nonfree \ 340 | --enable-openssl \ 341 | --enable-libfdk_aac \ 342 | --enable-libkvazaar \ 343 | --enable-libaom --extra-libs=-lpthread \ 344 | --enable-postproc \ 345 | --enable-small \ 346 | --enable-version3 \ 347 | --extra-cflags="-I${PREFIX}/include" \ 348 | --extra-ldflags="-L${PREFIX}/lib" \ 349 | --extra-libs=-ldl \ 350 | --prefix="${PREFIX}" && \ 351 | make && \ 352 | make install && \ 353 | make distclean && \ 354 | hash -r && \ 355 | cd tools && \ 356 | make qt-faststart && \ 357 | cp qt-faststart ${PREFIX}/bin 358 | 359 | RUN \ 360 | ldd ${PREFIX}/bin/ffmpeg | grep opt/ffmpeg | cut -d ' ' -f 3 | xargs -i cp {} /usr/local/lib/ && \ 361 | cp ${PREFIX}/bin/* /usr/local/bin/ && \ 362 | cp -r ${PREFIX}/share/ffmpeg /usr/local/share/ && \ 363 | LD_LIBRARY_PATH=/usr/local/lib ffmpeg -buildconf 364 | 365 | # Release 366 | FROM node:12-alpine 367 | LABEL maintainer="hello@rickydunlop.co.uk" 368 | 369 | COPY --from=build /usr/local /usr/local 370 | 371 | CMD ["node"] 372 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Docker Pulls](https://img.shields.io/docker/pulls/rickydunlop/nodejs-ffmpeg.svg)](https://hub.docker.com/r/rickydunlop/nodejs-ffmpeg/) 2 | [![Docker Automated build](https://img.shields.io/docker/automated/rickydunlop/nodejs-ffmpeg.svg)](https://hub.docker.com/r/rickydunlop/nodejs-ffmpeg/) 3 | 4 | # Alpine Linux NodeJS with FFmpeg 5 | 6 | This Dockerfile is based on [Node Alpine 12](https://hub.docker.com/_/node/) with FFmpeg installed. 7 | 8 | 9 | ## Build 10 | ```bash 11 | docker build -t node-ffmpeg . 12 | ``` 13 | 14 | ## Run 15 | 16 | ```bash 17 | docker run -it --rm --name my-node-ffmpeg node-ffmpeg 18 | ``` 19 | -------------------------------------------------------------------------------- /onbuild/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM rickydunlop/nodejs-ffmpeg 2 | 3 | RUN mkdir -p /usr/src/app 4 | WORKDIR /usr/src/app 5 | 6 | ONBUILD ARG NODE_ENV 7 | ONBUILD ENV NODE_ENV $NODE_ENV 8 | ONBUILD COPY package.json /usr/src/app/ 9 | ONBUILD RUN npm install 10 | ONBUILD COPY . /usr/src/app 11 | 12 | CMD [ "npm", "start" ] 13 | --------------------------------------------------------------------------------