### ALPINE MULTI-STAGE # Build stage for libraries FROM node:22-alpine AS builder # Install build dependencies RUN apk add --no-cache \ bash wget build-base autoconf automake cmake libtool pkgconf \ libjpeg-turbo-dev libpng-dev libwebp-dev tiff-dev libde265-dev \ ruby ruby-dev # Replace source built libde265 and libheif with installed libraries in next release # libheif-dev libde265-dev x265-dev # Build libde265 WORKDIR /build/libde265 RUN wget https://github.com/strukturag/libde265/archive/v1.0.15.tar.gz \ && tar -xvf v1.0.15.tar.gz \ && cd libde265-1.0.15 \ && cmake . \ && make \ && make install # Build libheif WORKDIR /build/libheif RUN wget https://github.com/strukturag/libheif/archive/v1.19.7.tar.gz \ && tar -xvf v1.19.7.tar.gz \ && cd libheif-1.19.7 \ && cmake --preset=release . \ && make \ && make install # Build ImageMagick WORKDIR /build/imagemagick RUN wget https://download.imagemagick.org/archive/releases/ImageMagick-7.1.1-44.tar.xz \ && tar -xvf ImageMagick-7.1.1-44.tar.xz \ && cd ImageMagick-7.1.1-44 \ && ./configure --with-heic=yes --with-webp=yes \ && make \ && make install # Node.js application build stage WORKDIR /usr/src/app COPY package*.json ./ RUN npm install -g typescript RUN npm install COPY . . RUN npm run build # Final stage FROM node:22-alpine # Install runtime dependencies only RUN apk add --no-cache \ bash redis ghostscript graphicsmagick imagemagick \ libjpeg-turbo libpng libwebp tiff # Copy built libraries from builder COPY --from=builder /usr/local/lib/ /usr/local/lib/ COPY --from=builder /usr/local/bin/ /usr/local/bin/ COPY --from=builder /usr/local/include/ /usr/local/include/ # Update library cache RUN ldconfig /usr/local/lib RUN npm install -g pm2 WORKDIR /usr/src/app # Copy built application from builder COPY --from=builder /usr/src/app/dist ./dist COPY --from=builder /usr/src/app/node_modules ./node_modules COPY --from=builder /usr/src/app/.env.production ./.env.production COPY --from=builder /usr/src/app/ecosystem.config.cjs ./ecosystem.config.cjs EXPOSE 8000 CMD ["sh", "-c", "redis-server --daemonize yes && pm2-runtime ecosystem.config.cjs"]