Spaces:
Running
Running
File size: 4,675 Bytes
c5eb6c5 098338f c5eb6c5 098338f c5eb6c5 098338f c5eb6c5 26aeae1 c5eb6c5 098338f c5eb6c5 098338f c5eb6c5 098338f c5eb6c5 098338f c5eb6c5 098338f c5eb6c5 098338f c5eb6c5 098338f c5eb6c5 098338f c5eb6c5 098338f c5eb6c5 098338f c5eb6c5 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | # Simplified build using official Node 22 slim and static ffmpeg
FROM node:22-slim AS base
# -----------------------------------------------------------------------------
# tools stage: install fonts and ffmpeg static binary
# -----------------------------------------------------------------------------
FROM base AS tools
USER root
RUN apt-get update
RUN apt-get update && apt-get install -y curl ca-certificates fonts-deva fonts-noto fonts-noto-cjk jq xz-utils
RUN apt-get update && \
apt-get install -y fontconfig \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir -p /usr/local/bin
# fetch and download the latest linux64 ffmpeg (cached layer)
RUN DOWNLOAD_URL=$(curl -sSL https://api.github.com/repos/BtbN/FFmpeg-Builds/releases/latest \
| jq -r '.assets[] | select(.name | test("linux64.*(gpl|lgpl).*tar.xz")) | .browser_download_url' \
| head -n1) && \
if [ -z "$DOWNLOAD_URL" ]; then echo "failed to determine ffmpeg download url"; exit 1; fi && \
echo "downloading ffmpeg from $DOWNLOAD_URL" && \
curl -L "$DOWNLOAD_URL" -o /tmp/ffmpeg.tar.xz
# extract ffmpeg archive into /opt/ffmpeg
RUN mkdir -p /opt/ffmpeg && \
tar -xJ -C /opt/ffmpeg --strip-components=1 -f /tmp/ffmpeg.tar.xz && \
rm /tmp/ffmpeg.tar.xz
ENV PATH="/opt/ffmpeg/bin:$PATH"
ENV LD_LIBRARY_PATH="/opt/ffmpeg/lib:$LD_LIBRARY_PATH"
# create app directory owned by non-root user
RUN mkdir -p /app && chown -R 1000:1000 /app
USER 1000
WORKDIR /app
# -----------------------------------------------------------------------------
# common-utils builder
# -----------------------------------------------------------------------------
FROM tools AS common-utils-builder
USER 1000
WORKDIR /app
COPY --chown=1000 common-utils/ ./common-utils
WORKDIR /app/common-utils
RUN npm ci && npm run build && echo "Common-utils build completed successfully"
# -----------------------------------------------------------------------------
# dependencies installation
# -----------------------------------------------------------------------------
FROM tools AS dependencies
USER 1000
WORKDIR /app
COPY --chown=1000 package*.json ./
COPY --chown=1000 .npmrc ./
COPY --from=common-utils-builder --chown=1000 /app/common-utils ./common-utils
ENV NODE_ENV=production
ENV CI=true
RUN npm cache clean --force
RUN set -e && \
echo "Starting dependency installation..." && \
(timeout 900 npm ci --verbose --ignore-scripts --production=false 2>&1 | tee /tmp/npm-install.log) || \
(echo "First attempt failed, cleaning cache and retrying..." && \
npm cache clean --force && \
rm -rf node_modules package-lock.json && \
timeout 900 npm install --verbose --ignore-scripts --production=false 2>&1 | tee -a /tmp/npm-install.log) || \
(echo "Second attempt failed, trying with reduced concurrency..." && \
npm cache clean --force && \
rm -rf node_modules && \
timeout 1200 npm install --verbose --maxsockets 1 --production=false 2>&1 | tee -a /tmp/npm-install.log)
RUN echo "Running postinstall scripts..." && \
echo "Skipping common-utils build in postinstall as it's already built" && \
node ffmpeg-fix.js 2>&1 | tee -a /tmp/postinstall.log || echo "ffmpeg-fix completed" && \
npm rebuild --verbose 2>&1 | tee -a /tmp/npm-rebuild.log || \
echo "Some rebuilds failed, but continuing..."
RUN node -e "console.log('Node version:', process.version)" && \
node -e "require('react'); console.log('React OK')" && \
node -e "require('remotion'); console.log('Remotion OK')" && \
ls -la node_modules/.bin/ | head -20
# -----------------------------------------------------------------------------
# final production image
# -----------------------------------------------------------------------------
FROM tools AS final
RUN mkdir -p /app/public /app/out /app/frames /app/uploads && chown -R 1000:1000 /app
COPY --from=dependencies --chown=1000 /app/node_modules ./app/node_modules
COPY --from=dependencies --chown=1000 /app/package*.json ./app/
COPY --from=dependencies --chown=1000 /app/common-utils ./app/common-utils
USER 1000
WORKDIR /app
COPY --chown=1000 . ./
COPY --chown=1000 start.sh /app/start.sh
RUN chmod +x /app/start.sh
RUN npm i
RUN echo "Verifying installation..." && \
node -e "console.log('Final verification - Node:', process.version)" && \
npm list --depth=0 | head -10 || true
EXPOSE 7860 3000 8083
CMD ["sh", "/app/start.sh"]
# build: docker build -f Dockerfile.build.lean -t semibit/render-farm:lean .
# run : docker run -p 8083:8083 -it --rm semibit/render-farm:lean
|