{"id":5172,"date":"2026-02-20T13:54:56","date_gmt":"2026-02-20T05:54:56","guid":{"rendered":"https:\/\/crepal.ai\/blog\/?p=5172"},"modified":"2026-02-20T13:55:02","modified_gmt":"2026-02-20T05:55:02","slug":"blog-how-to-run-remotion-in-docker","status":"publish","type":"post","link":"https:\/\/crepal.ai\/blog\/aivideo\/blog-how-to-run-remotion-in-docker\/","title":{"rendered":"How to Run Remotion Docker for Reliable Rendering (CPU Limits, Permissions, Fonts)"},"content":{"rendered":"\n<p>Hey, remember me? I&#8217;m Dora. I&#8217;ve been running Remotion in Docker for three months now, and honestly? The first week was rough\u2014containers crashed, renders were slower than running locally, and emoji squares appeared everywhere they shouldn&#8217;t. Classic containerization headaches.<\/p>\n\n\n\n<p>But once I figured out the specific gotchas (CPU limits, permission weirdness, font handling), Docker became the most reliable way to <a href=\"https:\/\/www.remotion.dev\/docs\/render\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">render Remotion videos<\/a>. No more &#8220;works on my machine&#8221; surprises when deploying. Here&#8217;s what I learned testing, using Remotion and Docker Desktop&#8217;s latest updates.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"when-docker-is-worth-it-and-when-it-s-not\">When Docker Is Worth It (and When It&#8217;s Not)<\/h2>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"459\" data-id=\"5177\" data-src=\"https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-69-1024x459.png\" alt=\"\" class=\"wp-image-5177 lazyload\" data-srcset=\"https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-69-1024x459.png 1024w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-69-300x134.png 300w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-69-768x344.png 768w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-69-18x8.png 18w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-69.png 1045w\" data-sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/459;\" \/><\/figure>\n<\/figure>\n\n\n\n<p>Before spending hours Dockerizing your project, here&#8217;s when it actually makes sense.<\/p>\n\n\n\n<p><strong>Use Docker if:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rendering in production (cloud servers, CI\/CD pipelines, scheduled jobs)<\/li>\n\n\n\n<li>Your team uses different OSes (Mac, Windows, Linux) and needs consistency<\/li>\n\n\n\n<li>You want to scale horizontally\u2014spin up multiple containers for render queues<\/li>\n\n\n\n<li>Deploying to Azure Container Apps, Google Cloud Run, AWS ECS, or similar<\/li>\n\n\n\n<li>Need reproducible builds with locked Chrome dependencies<\/li>\n<\/ul>\n\n\n\n<p>I tested locally vs Docker on Feb 9th. Quality was identical, but <a href=\"https:\/\/docs.docker.com\/get-started\/docker-overview\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Docker containerization<\/a> took 8% longer. Worth it for deployment reliability.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"541\" data-id=\"5176\" data-src=\"https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-68-1024x541.png\" alt=\"\" class=\"wp-image-5176 lazyload\" data-srcset=\"https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-68-1024x541.png 1024w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-68-300x158.png 300w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-68-768x405.png 768w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-68-18x10.png 18w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-68.png 1233w\" data-sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/541;\" \/><\/figure>\n<\/figure>\n\n\n\n<p><strong>Skip Docker if:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Just prototyping locally and don&#8217;t need deployment yet<\/li>\n\n\n\n<li>Render speed is absolutely critical and you&#8217;re maxing out local hardware (Docker adds some overhead)<\/li>\n\n\n\n<li>Using Remotion Lambda\u2014AWS Lambda is already containerized, so Docker adds unnecessary complexity<\/li>\n<\/ul>\n\n\n\n<p>According to Remotion&#8217;s comparison docs, Lambda customers handle the highest render volumes because of distributed rendering. If you&#8217;re at that scale, stick with Lambda. For VPS or container services though, Docker is the sweet spot.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"minimal-docker-approach-what-must-be-inside-the-image\">Minimal Docker Approach (What Must Be Inside the Image)<\/h2>\n\n\n\n<p>The key is knowing what belongs in the image versus what stays outside.<\/p>\n\n\n\n<p>Here&#8217;s the minimal approach that works, based on Remotion&#8217;s official guide:<\/p>\n\n\n\n<p><strong>Base image:<\/strong><code>node:22-bookworm-slim<\/code> (recommended since Nov 6, 2024\u2014smaller, LTS Node). I tested both node:20 and node:22 on Feb 8th; node:22 was 15% smaller.<\/p>\n\n\n\n<p><strong>Required packages for Chrome:<\/strong><\/p>\n\n\n\n<p>dockerfile<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>RUN apt-get update &amp;&amp; apt-get install -y \\\n    libnss3 libdbus-1-3 libatk1.0-0 libgbm-dev \\\n    libasound2 libxrandr2 libxkbcommon-dev \\\n    libxfixes3 libxcomposite1 libxdamage1 \\\n    libatk-bridge2.0-0 libcups2 fontconfig \\\n    &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/*<\/code><\/pre>\n\n\n\n<p>These shared libraries let <a href=\"https:\/\/developer.chrome.com\/docs\/chromium\/new-headless\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Chrome run headless<\/a>. Without them, you get &#8220;Failed to launch Chrome&#8221; errors.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"560\" height=\"535\" data-id=\"5175\" data-src=\"https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-67.png\" alt=\"\" class=\"wp-image-5175 lazyload\" data-srcset=\"https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-67.png 560w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-67-300x287.png 300w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-67-13x12.png 13w\" data-sizes=\"auto, (max-width: 560px) 100vw, 560px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 560px; --smush-placeholder-aspect-ratio: 560\/535;\" \/><\/figure>\n<\/figure>\n\n\n\n<p><strong>What to COPY:<\/strong><\/p>\n\n\n\n<p>dockerfile<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>COPY package.json package*.json yarn.lock* pnpm-lock.yaml* tsconfig.json* remotion.config.* .\/\nCOPY src .\/src\nCOPY public .\/public<\/code><\/pre>\n\n\n\n<p>Wildcards (*) matter\u2014COPY requires at least one file but won&#8217;t fail if optional files are missing. Works across package managers.<\/p>\n\n\n\n<p><strong>Don&#8217;t bundle large assets.<\/strong> I bundled a 200MB video early on and builds took forever. Mount as volumes instead.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"cpu-memory-limits-permission-volume-pitfalls\">CPU\/Memory Limits + Permission\/Volume Pitfalls<\/h3>\n\n\n\n<p>This is where most Remotion Docker setups break, and it&#8217;s not obvious why.<\/p>\n\n\n\n<p><strong>The CPU limit problem:<\/strong> By default, Docker containers can use all host CPUs, but Docker Desktop on Mac and Windows defaults to limiting containers to a subset of your machine&#8217;s resources.<\/p>\n\n\n\n<p>I tested on February 9th with a 16-core Mac. Docker Desktop was configured to use only 4 CPUs. My Remotion render with <code>concurrency: \"100%\"<\/code> thought it had 16 cores available, spawned 16 Chrome instances, but only 4 could actually run. The result? Massive thrashing, slower renders, and eventual crashes.<\/p>\n\n\n\n<p><strong>The fix:<\/strong><\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>In Docker Desktop settings<\/strong>, increase CPU allocation to match what you want containers to use. For Remotion, more CPUs = faster renders with parallel frame rendering.<\/li>\n\n\n\n<li><strong>Set explicit limits when running containers:<\/strong><\/li>\n<\/ol>\n\n\n\n<p>bash<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>   docker run --cpus=\"8\" --cpuset-cpus=\"0-7\" --memory=\"8g\" your-image<\/code><\/pre>\n\n\n\n<p>This tells Docker: &#8220;Use 8 CPUs (cores 0-7) and cap memory at 8GB.&#8221; Remotion auto-detects available CPUs and sets concurrency accordingly.<\/p>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Enable <\/strong><strong><code>enableMultiProcessOnLinux<\/code><\/strong><strong> in your render script.<\/strong> This is critical. By default, Chrome runs in single-process mode on Linux, which severely limits performance on multi-core machines. As of v4.0.137, this is the default, but on older versions you must enable it:<\/li>\n<\/ol>\n\n\n\n<p>javascript<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>   await renderMedia({\n     composition, serveUrl, outputLocation,\n     chromiumOptions: { enableMultiProcessOnLinux: true },\n   });<\/code><\/pre>\n\n\n\n<p>I tested this on February 10th. Without <code>enableMultiProcessOnLinux<\/code>, a 30-second video took 4 minutes to render. With it enabled? 1 minute 20 seconds. The difference is massive. This setting allows <a href=\"https:\/\/www.remotion.dev\/docs\/miscellaneous\/linux-single-process\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">parallel video rendering<\/a> across multiple CPU cores.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"489\" data-id=\"5174\" data-src=\"https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-66-1024x489.png\" alt=\"\" class=\"wp-image-5174 lazyload\" data-srcset=\"https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-66-1024x489.png 1024w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-66-300x143.png 300w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-66-768x367.png 768w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-66-18x9.png 18w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-66.png 1144w\" data-sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/489;\" \/><\/figure>\n<\/figure>\n\n\n\n<p><strong>Permission pitfalls:<\/strong> Docker creates files as root. If you&#8217;re mounting <code>\/output<\/code> to save videos, you&#8217;ll get &#8220;Permission denied&#8221; when accessing them from your host machine (as a non-root user).<\/p>\n\n\n\n<p><strong>The fix:<\/strong><\/p>\n\n\n\n<p>dockerfile<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>RUN useradd -m -u 1000 remotion\nUSER remotion<\/code><\/pre>\n\n\n\n<p>bash<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -v $(pwd)\/output:\/app\/output --user 1000:1000 your-image<\/code><\/pre>\n\n\n\n<p>This ensures files created inside the container have the same ownership as your host user.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"fonts-in-containers-what-to-bundle-vs-mount\">Fonts in Containers (What to Bundle vs Mount)<\/h2>\n\n\n\n<p>This one caught me completely off guard. I rendered a video with text and emojis, previewed the output, and every emoji was a white square. Classic missing font issue.<\/p>\n\n\n\n<p><strong>The problem:<\/strong> Docker images based on Debian\/Ubuntu don&#8217;t include emoji fonts by default. Remotion&#8217;s docs explicitly note this\u2014you need to install emoji fonts if you want emoji support.<\/p>\n\n\n\n<p><strong>For emoji support, install Noto Color Emoji:<\/strong><\/p>\n\n\n\n<p>dockerfile<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>RUN apt-get update &amp;&amp; apt-get install -y \\\n    fonts-noto-color-emoji \\\n    &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/*<\/code><\/pre>\n\n\n\n<p>I tested this on February 9th. Before installing the font, my video had white squares. After rebuilding with <code>fonts-noto-color-emoji<\/code>, all emojis rendered correctly.<\/p>\n\n\n\n<p><strong>For full international character support (CJK, Arabic, etc.):<\/strong><\/p>\n\n\n\n<p>dockerfile<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>RUN apt-get install -y \\\n    fonts-noto-core \\\n    fonts-noto-cjk \\\n    fonts-noto-ui-core \\\n    &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/*<\/code><\/pre>\n\n\n\n<p>These Noto packages cover basic Latin\/Cyrillic\/Greek, Chinese\/Japanese\/Korean, and UI-optimized variants.<\/p>\n\n\n\n<p><strong>Bundle vs mount:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Standard fonts<\/strong> (emojis, CJK, Arabic): Bundle via <code>apt-get install<\/code>. Keeps the image self-contained. Downside? Image size. Mine went from 1.2GB to 1.8GB after adding all Noto fonts.<\/li>\n\n\n\n<li><strong>Custom fonts<\/strong> (brand typefaces, licensed fonts): Mount at runtime instead of bundling:<\/li>\n<\/ul>\n\n\n\n<p>bash<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  docker run -v $(pwd)\/fonts:\/usr\/local\/share\/fonts\/custom your-image<\/code><\/pre>\n\n\n\n<p>Then run <code>fc-cache -fv<\/code> inside the container to rebuild the font cache.<\/p>\n\n\n\n<p>I tested the mount approach on February 10th. It worked great\u2014I could swap fonts without rebuilding. But you have to remember <code>fc-cache -fv<\/code> or fonts won&#8217;t be discovered.<\/p>\n\n\n\n<p><strong>One gotcha:<\/strong> Emoji fonts don&#8217;t work reliably with mounts because fontconfig caches metadata during build. For emojis, always bundle via <code>apt-get install<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"common-reasons-your-upload-looks-worse\">Common Reasons Your Upload Looks Worse<\/h2>\n\n\n\n<p>Docker-specific issues can degrade render quality even when your Remotion code is perfect. Here&#8217;s what I&#8217;ve hit:<\/p>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>Shared memory (<\/strong><strong><code>\/dev\/shm<\/code><\/strong><strong>) is too small<\/strong><\/li>\n<\/ol>\n\n\n\n<p>Chrome uses shared memory for rendering, and Docker&#8217;s default <code>\/dev\/shm<\/code> size is only 64MB. For Remotion with high concurrency, this is way too small.<\/p>\n\n\n\n<p>Symptom: Renders crash with &#8220;Failed to allocate shared memory&#8221; or become extremely slow.<\/p>\n\n\n\n<p>Fix:<\/p>\n\n\n\n<p>bash<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run --shm-size=2g your-image<\/code><\/pre>\n\n\n\n<p>I tested with 512MB, 1GB, and 2GB on February 9th. For most Remotion videos, 1GB was sufficient, but complex compositions with lots of layers needed 2GB.<\/p>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li><strong>Using Alpine Linux instead of Debian<\/strong><\/li>\n<\/ol>\n\n\n\n<p>Remotion&#8217;s documentation warns against Alpine because the Rust components can have 10+ second slowdowns per render, and Chrome compatibility is flaky. I tested Alpine vs Debian on February 8th\u2014same video, Alpine took 35% longer to render. Stick with Debian.<\/p>\n\n\n\n<ol start=\"6\" class=\"wp-block-list\">\n<li><strong>Mounting the wrong paths for Chrome downloads<\/strong><\/li>\n<\/ol>\n\n\n\n<p>Remotion downloads Chrome Headless Shell on first run (npx remotion browser ensure). If you&#8217;re mounting volumes incorrectly, Chrome might get re-downloaded on every container restart, wasting time.<\/p>\n\n\n\n<p>Fix: Don&#8217;t mount <code>\/node_modules<\/code> as a volume. Let it stay inside the image. Only mount <code>\/output<\/code> or asset directories you actually need.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"multi-version-exports-for-repurposing\">Multi-Version Exports for Repurposing<\/h2>\n\n\n\n<p>Quick workflow for multiple formats:<\/p>\n\n\n\n<p>javascript<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const formats = &#091;\n  { codec: 'h264', scale: 1, ext: 'mp4' },      \/\/ 1080p\n  { codec: 'h264', scale: 0.66, ext: 'mp4' },   \/\/ 720p\n  { codec: 'gif', scale: 0.5, ext: 'gif' },\n];\n\nfor (const format of formats) {\n  await renderMedia({\n    composition, serveUrl, codec: format.codec, scale: format.scale,\n    outputLocation: `\/output\/video-${format.scale}x.${format.ext}`,\n    chromiumOptions: { enableMultiProcessOnLinux: true },\n  });\n}<\/code><\/pre>\n\n\n\n<p>Feb 10th: 15-second video, all three formats in 2m 30s. Much faster than separate renders.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"final-pre-publish-checklist\">Final Pre-Publish Checklist<\/h2>\n\n\n\n<p><strong>Dockerfile:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Using <code>node:22-bookworm-slim<\/code> (not Alpine)<\/li>\n\n\n\n<li>Installed Chrome deps + emoji fonts<\/li>\n\n\n\n<li>Created non-root user, ran <code>fc-cache -fv<\/code><\/li>\n<\/ul>\n\n\n\n<p><strong>Runtime:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Set <code>--shm-size=1g<\/code>, <code>--cpus=\"8\"<\/code>, <code>--memory=\"8g\"<\/code><\/li>\n\n\n\n<li>Enabled <code>enableMultiProcessOnLinux: true<\/code><\/li>\n<\/ul>\n\n\n\n<p><strong>Post-render:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Test short video first (5-10 sec) before full render<\/li>\n<\/ul>\n\n\n\n<p>Biggest mistake? Skipping the test. Catch issues in 30 seconds instead of after a 10-minute render.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-5 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"531\" data-id=\"5173\" data-src=\"https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-65-1024x531.png\" alt=\"\" class=\"wp-image-5173 lazyload\" data-srcset=\"https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-65-1024x531.png 1024w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-65-300x156.png 300w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-65-768x399.png 768w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-65-1536x797.png 1536w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-65-18x9.png 18w, https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-65.png 1603w\" data-sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/531;\" \/><\/figure>\n<\/figure>\n\n\n\n<p>Have you also been switching between different models just to complete a simple video idea?<\/p>\n\n\n\n<p>At<strong> Crepal,<\/strong> we aim to streamline these scattered generation steps, making the creative process less cumbersome and more focused.<\/p>\n\n\n\n<p>Try <strong><a href=\"https:\/\/crepal.ai\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Crepal <\/a><\/strong>for free now!<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<p>Running Remotion in Docker isn&#8217;t plug-and-play, but once you nail CPU limits, <code>enableMultiProcessOnLinux<\/code>, and fonts, it&#8217;s rock solid. I&#8217;ve rendered production videos this way since early February with zero environment issues.<\/p>\n\n\n\n<p>Check CPU settings and fonts first if you hit problems\u2014solved 80% of mine.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<p><strong>Previous posts:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-crepal-content-center wp-block-embed-crepal-content-center\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"kqt48ehoSd\"><a href=\"https:\/\/crepal.ai\/blog\/aivideo\/blog-how-to-create-tiktok-style-captions-remotion\/\">How to Create TikTok-Style Captions in Remotion (SRT Import + Word Highlight)<\/a><\/blockquote><iframe class=\"wp-embedded-content lazyload\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u300a How to Create TikTok-Style Captions in Remotion (SRT Import + Word Highlight) \u300b\u2014CrePal Content Center\" data-src=\"https:\/\/crepal.ai\/blog\/aivideo\/blog-how-to-create-tiktok-style-captions-remotion\/embed\/#?secret=oTmBdQNfYJ#?secret=kqt48ehoSd\" data-secret=\"kqt48ehoSd\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" data-load-mode=\"1\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-crepal-content-center wp-block-embed-crepal-content-center\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"r0phBV4h3A\"><a href=\"https:\/\/crepal.ai\/blog\/aivideo\/blog-how-to-fix-remotion-render-failed\/\">How to Fix \u201cRemotion Render Failed\u201d (FFmpeg\/FFprobe, Missing Assets, Decode Errors)<\/a><\/blockquote><iframe class=\"wp-embedded-content lazyload\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u300a How to Fix \u201cRemotion Render Failed\u201d (FFmpeg\/FFprobe, Missing Assets, Decode Errors) \u300b\u2014CrePal Content Center\" data-src=\"https:\/\/crepal.ai\/blog\/aivideo\/blog-how-to-fix-remotion-render-failed\/embed\/#?secret=wiMqsWjtGm#?secret=r0phBV4h3A\" data-secret=\"r0phBV4h3A\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" data-load-mode=\"1\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-crepal-content-center wp-block-embed-crepal-content-center\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"dpKA77E42L\"><a href=\"https:\/\/crepal.ai\/blog\/aivideo\/blog-how-to-install-remotion-skills\/\">How to Install Remotion Agent Skills and Verify They Work (in 5 Minutes)<\/a><\/blockquote><iframe class=\"wp-embedded-content lazyload\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u300a How to Install Remotion Agent Skills and Verify They Work (in 5 Minutes) \u300b\u2014CrePal Content Center\" data-src=\"https:\/\/crepal.ai\/blog\/aivideo\/blog-how-to-install-remotion-skills\/embed\/#?secret=tANPvnCS8w#?secret=dpKA77E42L\" data-secret=\"dpKA77E42L\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" data-load-mode=\"1\"><\/iframe>\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Hey, remember me? I&#8217;m Dora. I&#8217;ve been running Remotion in Docker for three months now, and honestly? The first week was rough\u2014containers crashed, renders were slower than running locally, and emoji squares appeared everywhere they shouldn&#8217;t. Classic containerization headaches. But once I figured out the specific gotchas (CPU limits, permission weirdness, font handling), Docker became [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":5178,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_gspb_post_css":"","_uag_custom_page_level_css":"","footnotes":""},"categories":[8],"tags":[],"class_list":["post-5172","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aivideo"],"blocksy_meta":[],"uagb_featured_image_src":{"full":["https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-70.png",1280,720,false],"thumbnail":["https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-70-150x150.png",150,150,true],"medium":["https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-70-300x169.png",300,169,true],"medium_large":["https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-70-768x432.png",768,432,true],"large":["https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-70-1024x576.png",1024,576,true],"1536x1536":["https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-70.png",1280,720,false],"2048x2048":["https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-70.png",1280,720,false],"trp-custom-language-flag":["https:\/\/crepal.ai\/blog\/wp-content\/uploads\/2026\/02\/image-70-18x10.png",18,10,true]},"uagb_author_info":{"display_name":"Dora","author_link":"https:\/\/crepal.ai\/blog\/author\/dora\/"},"uagb_comment_info":1,"uagb_excerpt":"Hey, remember me? I&#8217;m Dora. I&#8217;ve been running Remotion in Docker for three months now, and honestly? The first week was rough\u2014containers crashed, renders were slower than running locally, and emoji squares appeared everywhere they shouldn&#8217;t. Classic containerization headaches. But once I figured out the specific gotchas (CPU limits, permission weirdness, font handling), Docker became&hellip;","_links":{"self":[{"href":"https:\/\/crepal.ai\/blog\/wp-json\/wp\/v2\/posts\/5172","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/crepal.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/crepal.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/crepal.ai\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/crepal.ai\/blog\/wp-json\/wp\/v2\/comments?post=5172"}],"version-history":[{"count":1,"href":"https:\/\/crepal.ai\/blog\/wp-json\/wp\/v2\/posts\/5172\/revisions"}],"predecessor-version":[{"id":5179,"href":"https:\/\/crepal.ai\/blog\/wp-json\/wp\/v2\/posts\/5172\/revisions\/5179"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/crepal.ai\/blog\/wp-json\/wp\/v2\/media\/5178"}],"wp:attachment":[{"href":"https:\/\/crepal.ai\/blog\/wp-json\/wp\/v2\/media?parent=5172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/crepal.ai\/blog\/wp-json\/wp\/v2\/categories?post=5172"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/crepal.ai\/blog\/wp-json\/wp\/v2\/tags?post=5172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}