mcpField
F
ffmpeg-docker-containers

ffmpeg-docker-containers

github.com/josiahsiegelクラウド・DevOps5976 回インストール19 週間前に更新
リポジトリ

ffmpeg-docker-containers について

Docker コンテナで FFmpeg を実行するための実用スキルガイドです。動画処理パイプラインやサービス向けに、イメージ選択、ハードウェアアクセラレーション、デプロイ方法を扱います。

主な機能

  1. 01FFmpeg Docker イメージの種類の比較
  2. 02コンテナ内でのトランスコード実行
  3. 03NVIDIA、Intel、AMD GPU の設定
  4. 04Compose と Kubernetes のデプロイ
  5. 05リソース制限とマウントボリュームの調整

活用シーン

  1. 01CI/CD パイプラインでの FFmpeg バージョン統一
  2. 02本番トランスコードサービスの運用
  3. 03Kubernetes での動画処理ジョブの実行
  4. 04GPU アクセラレーションを使うコンテナ処理の設定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/josiahsiegel/claude-plugin-marketplace --skill ffmpeg-docker-containers

インストール後、Claude Code で/ffmpeg-docker-containersを入力して読み込まれたか確認します。

詳細

重要なガイドライン

Windows のファイルパス要件

必須:Windows ではファイルパスに常にバックスラッシュを使用してください

Windows で Edit または Write ツールを使用する場合、ファイルパスにはスラッシュ(/)ではなく、バックスラッシュ(\)を必ず使用してください。


クイックリファレンス

イメージサイズGPUコマンド
jrottenberg/ffmpeg:7.1-alpine320~100MBなしdocker run --rm -v $(pwd):/data jrottenberg/ffmpeg:7.1-alpine320 -i /data/input.mp4 /data/output.mp4
jrottenberg/ffmpeg:7.1-nvidia2404~1.5GBNVIDIAdocker run --gpus all --rm -v $(pwd):/data jrottenberg/ffmpeg:7.1-nvidia2404 ...
jrottenberg/ffmpeg:7.1-vaapi2404~300MBIntel/AMD--device /dev/dri:/dev/dri を追加
linuxserver/ffmpeg:latest~150MBなしLinuxServer.io がメンテナンス

このスキルを使用する場面

コンテナ化された FFmpeg のデプロイには、次のような場面で使用します。

  • 一貫した FFmpeg バージョンが必要な CI/CD パイプライン
  • FFmpeg の要件がユーザーごとに異なるマルチユーザーシステム
  • 本番環境のトランスコードサービス
  • Kubernetes の動画処理ジョブ
  • GPU パススルー構成

Docker コンテナでの FFmpeg(2025)

GPU サポート、最適化、本番環境向けのパターンを含む、Docker コンテナで FFmpeg を実行するための完全ガイドです。

FFmpeg に Docker を使用する理由

メリット
  • 分離:ホストシステム上での依存関係の競合がありません
  • 再現性:どこでも同じ FFmpeg バージョンを使用できます
  • 移植性:プラットフォーム間で同じように動作します
  • 簡単な更新:イメージタグを変更するだけで FFmpeg のバージョンを切り替えられます
  • CI/CD との統合:パイプラインで一貫したビルドを実現できます
  • GPU アクセス:NVIDIA、Intel、AMD のハードウェアアクセラレーションを利用できます
Docker を使用する場面
  • FFmpeg の要件が異なるマルチユーザー環境
  • 特定の FFmpeg ビルドが必要な CI/CD パイプライン
  • 本番環境のトランスコードサービス
  • コンテナ化されたマイクロサービスアーキテクチャ
  • システムの FFmpeg に含まれていない特定のコーデックや機能が必要な場合

人気の FFmpeg Docker イメージ

jrottenberg/ffmpeg(推奨)

最も人気があり、メンテナンスが行き届いた FFmpeg Docker イメージです。

利用可能なバリアント:

タグベースサイズ用途
7.1-ubuntu2404Ubuntu 24.04 LTS~250MB本番環境、フル機能
7.1-alpine320Alpine 3.20~100MB最小構成、高速な起動
7.1-nvidia2404Ubuntu + CUDA~1.5GBNVIDIA GPU
7.1-vaapi2404Ubuntu + VAAPI~300MBIntel/AMD GPU(Linux)
7.1-scratchScratch~80MB最小構成、静的バイナリ
8.0-ubuntu2404Ubuntu 24.04 LTS~250MB最新の FFmpeg 8.0
# Pull specific version
docker pull jrottenberg/ffmpeg:7.1-ubuntu2404

# Latest (not recommended for production)
docker pull jrottenberg/ffmpeg:latest
linuxserver/ffmpeg

一時的なコマンドラインでの使用向けに設計されています。

docker pull linuxserver/ffmpeg:latest
mwader/static-ffmpeg

静的コンパイルされた FFmpeg バイナリです。

docker pull mwader/static-ffmpeg:7.1

基本的な使い方

シンプルなトランスコード
# Mount current directory and run FFmpeg
docker run --rm \
  -v $(pwd):/data \
  jrottenberg/ffmpeg:7.1-ubuntu2404 \
  -i /data/input.mp4 \
  -c:v libx264 \
  -c:a aac \
  /data/output.mp4
Windows(PowerShell)
# Windows PowerShell
docker run --rm `
  -v ${PWD}:/data `
  jrottenberg/ffmpeg:7.1-ubuntu2404 `
  -i /data/input.mp4 `
  -c:v libx264 `
  /data/output.mp4
Windows(Git Bash/MINGW)
# Git Bash requires MSYS_NO_PATHCONV to prevent path conversion
MSYS_NO_PATHCONV=1 docker run --rm \
  -v "$(pwd)":/data \
  jrottenberg/ffmpeg:7.1-ubuntu2404 \
  -i /data/input.mp4 \
  -c:v libx264 \
  /data/output.mp4
絶対パスを使用する
# Linux/macOS
docker run --rm \
  -v /home/user/videos:/input:ro \
  -v /home/user/output:/output \
  jrottenberg/ffmpeg:7.1-ubuntu2404 \
  -i /input/video.mp4 \
  /output/converted.mp4

# Windows
docker run --rm \
  -v C:\Videos:/input:ro \
  -v C:\Output:/output \
  jrottenberg/ffmpeg:7.1-ubuntu2404 \
  -i /input/video.mp4 \
  /output/converted.mp4

Docker での GPU アクセラレーション

NVIDIA GPU(Docker + NVIDIA Container Toolkit)

要件:

  1. NVENC をサポートする NVIDIA GPU
  2. NVIDIA ドライバー 450 以上
  3. NVIDIA Container Toolkit のインストール

NVIDIA Container Toolkit をインストールする:

# Ubuntu/Debian
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
  sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

NVIDIA GPU を使用して実行する:

docker run --rm --gpus all \
  -v $(pwd):/data \
  jrottenberg/ffmpeg:7.1-nvidia2404 \
  -hwaccel cuda \
  -hwaccel_output_format cuda \
  -i /data/input.mp4 \
  -c:v h264_nvenc \
  -preset p4 \
  /data/output.mp4

特定の GPU を選択する:

# Use GPU 0 only
docker run --rm --gpus '"device=0"' \
  -v $(pwd):/data \
  jrottenberg/ffmpeg:7.1-nvidia2404 \
  -hwaccel cuda -i /data/input.mp4 -c:v h264_nvenc /data/output.mp4

# Use multiple GPUs
docker run --rm --gpus '"device=0,1"' \
  -v $(pwd):/data \
  jrottenberg/ffmpeg:7.1-nvidia2404 \
  ...
Intel QSV/VAAPI(Linux)
# Intel GPU with VAAPI
docker run --rm \
  --device=/dev/dri:/dev/dri \
  -v $(pwd):/data \
  jrottenberg/ffmpeg:7.1-vaapi2404 \
  -hwaccel vaapi \
  -hwaccel_device /dev/dri/renderD128 \
  -hwaccel_output_format vaapi \
  -i /data/input.mp4 \
  -vf 'format=nv12|vaapi,hwupload' \
  -c:v h264_vaapi \
  /data/output.mp4
AMD GPU(Linux VAAPI)
docker run --rm \
  --device=/dev/dri:/dev/dri \
  --device=/dev/kfd:/dev/kfd \
  --group-add video \
  -v $(pwd):/data \
  jrottenberg/ffmpeg:7.1-vaapi2404 \
  -hwaccel vaapi \
  -hwaccel_device /dev/dri/renderD128 \
  -i /data/input.mp4 \
  -c:v h264_vaapi \
  /data/output.mp4

カスタム FFmpeg イメージのビルド

最小構成のカスタム Dockerfile
FROM ubuntu:24.04 AS builder

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y \
    build-essential \
    pkg-config \
    yasm \
    nasm \
    git \
    wget \
    libx264-dev \
    libx265-dev \
    libvpx-dev \
    libfdk-aac-dev \
    libmp3lame-dev \
    libopus-dev \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /tmp/ffmpeg
RUN wget -O ffmpeg.tar.bz2 https://ffmpeg.org/releases/ffmpeg-7.1.tar.bz2 && \
    tar xjf ffmpeg.tar.bz2 --strip-components=1

RUN ./configure \
    --enable-gpl \
    --enable-nonfree \
    --enable-libx264 \
    --enable-libx265 \
    --enable-libvpx \
    --enable-libfdk-aac \
    --enable-libmp3lame \
    --enable-libopus \
    --disable-doc \
    --disable-debug && \
    make -j$(nproc) && \
    make install

# Production stage
FROM ubuntu:24.04

RUN apt-get update && apt-get install -y \
    libx264-164 \
    libx265-209 \
    libvpx9 \
    libfdk-aac2 \
    libmp3lame0 \
    libopus0 \
    && rm -rf /var/lib/apt/lists/*

COPY --from=builder /usr/local/bin/ffmpeg /usr/local/bin/
COPY --from=builder /usr/local/bin/ffprobe /usr/local/bin/

ENTRYPOINT ["ffmpeg"]
NVIDIA サポートを有効にしてビルドする
FROM nvidia/cuda:12.4-devel-ubuntu24.04 AS builder

ENV DEBIAN_FRONTEND=noninteractive

# Install build dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    pkg-config \
    yasm \
    nasm \
    git \
    wget \
    libx264-dev \
    libx265-dev \
    && rm -rf /var/lib/apt/lists/*

# Install nv-codec-headers
RUN git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git && \
    cd nv-codec-headers && \
    make install

# Build FFmpeg
WORKDIR /tmp/ffmpeg
RUN wget -O ffmpeg.tar.bz2 https://ffmpeg.org/releases/ffmpeg-7.1.tar.bz2 && \
    tar xjf ffmpeg.tar.bz2 --strip-components=1

RUN ./configure \
    --enable-gpl \
    --enable-nonfree \
    --enable-cuda-nvcc \
    --enable-libnpp \
    --enable-nvenc \
    --enable-nvdec \
    --enable-cuvid \
    --enable-libx264 \
    --enable-libx265 \
    --extra-cflags=-I/usr/local/cuda/include \
    --extra-ldflags=-L/usr/local/cuda/lib64 && \
    make -j$(nproc) && \
    make install

# Production stage
FROM nvidia/cuda:12.4-runtime-ubuntu24.04

RUN apt-get update && apt-get install -y \
    libx264-164 \
    libx265-209 \
    && rm -rf /var/lib/apt/lists/*

COPY --from=builder /usr/local/bin/ffmpeg /usr/local/bin/
COPY --from=builder /usr/local/bin/ffprobe /usr/local/bin/

ENTRYPOINT ["ffmpeg"]

Docker Compose のパターン

シンプルなトランスコードサービス
version: '3.8'

services:
  ffmpeg:
    image: jrottenberg/ffmpeg:7.1-ubuntu2404
    volumes:
      - ./input:/input:ro
      - ./output:/output
    command: >
      -i /input/video.mp4
      -c:v libx264 -crf 23
      -c:a aac -b:a 128k
      /output/converted.mp4
GPU アクセラレーション対応サービス
version: '3.8'

services:
  ffmpeg-gpu:
    image: jrottenberg/ffmpeg:7.1-nvidia2404
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    volumes:
      - ./input:/input:ro
      - ./output:/output
    command: >
      -hwaccel cuda
      -hwaccel_output_format cuda
      -i /input/video.mp4
      -c:v h264_nvenc
      /output/output.mp4
監視フォルダーでの処理
version: '3.8'

services:
  ffmpeg-watcher:
    image: jrottenberg/ffmpeg:7.1-ubuntu2404
    volumes:
      - ./watch:/watch
      - ./done:/done
    entrypoint: ["/bin/sh", "-c"]
    command:
      - |
        while true; do
          for f in /watch/*.mp4; do
            [ -e "$$f" ] || continue
            filename=$$(basename "$$f")
            ffmpeg -i "$$f" -c:v libx264 -crf 23 "/done/$$filename"
            rm "$$f"
          done
          sleep 5
        done
    restart: unless-stopped

Kubernetes へのデプロイ

FFmpeg ジョブ
apiVersion: batch/v1
kind: Job
metadata:
  name: ffmpeg-transcode
spec:
  template:
    spec:
      containers:
        - name: ffmpeg
          image: jrottenberg/ffmpeg:7.1-ubuntu2404
          command:
            - ffmpeg
            - -i
            - /input/video.mp4
            - -c:v
            - libx264
            - /output/output.mp4
          volumeMounts:
            - name: input
              mountPath: /input
              readOnly: true
            - name: output
              mountPath: /output
      volumes:
        - name: input
          persistentVolumeClaim:
            claimName: input-pvc
        - name: output
          persistentVolumeClaim:
            claimName: output-pvc
      restartPolicy: Never
GPU 対応 Pod(NVIDIA)
apiVersion: v1
kind: Pod
metadata:
  name: ffmpeg-gpu
spec:
  containers:
    - name: ffmpeg
      image: jrottenberg/ffmpeg:7.1-nvidia2404
      resources:
        limits:
          nvidia.com/gpu: 1
      command:
        - ffmpeg
        - -hwaccel
        - cuda
        - -i
        - /input/video.mp4
        - -c:v
        - h264_nvenc
        - /output/output.mp4
      volumeMounts:
        - name: input
          mountPath: /input
        - name: output
          mountPath: /output
  volumes:
    - name: input
      hostPath:
        path: /data/input
    - name: output
      hostPath:
        path: /data/output

パフォーマンスの最適化

ボリュームマウントのベストプラクティス
# Read-only input for security
docker run --rm \
  -v $(pwd)/input:/input:ro \
  -v $(pwd)/output:/output \
  jrottenberg/ffmpeg:7.1-ubuntu2404 \
  -i /input/video.mp4 /output/output.mp4

# Use tmpfs for temp files
docker run --rm \
  --tmpfs /tmp:size=1G \
  -v $(pwd):/data \
  jrottenberg/ffmpeg:7.1-ubuntu2404 \
  -i /data/input.mp4 /data/output.mp4
リソース制限
# Limit CPU and memory
docker run --rm \
  --cpus="4" \
  --memory="4g" \
  -v $(pwd):/data \
  jrottenberg/ffmpeg:7.1-ubuntu2404 \
  -threads 4 \
  -i /data/input.mp4 /data/output.mp4
並列処理
# Process multiple files in parallel
for f in *.mp4; do
  docker run --rm -d \
    --cpus="2" \
    -v $(pwd):/data \
    jrottenberg/ffmpeg:7.1-ubuntu2404 \
    -i "/data/$f" "/data/converted_$f"
done

トラブルシューティング

よくある問題

出力時にアクセス拒否が発生する:

# Check file ownership
ls -la output/

# Run with current user
docker run --rm \
  --user $(id -u):$(id -g) \
  -v $(pwd):/data \
  jrottenberg/ffmpeg:7.1-ubuntu2404 \
  -i /data/input.mp4 /data/output.mp4

GPU が検出されない:

# Verify NVIDIA runtime
docker run --rm --gpus all nvidia/cuda:12.4-base-ubuntu24.04 nvidia-smi

# Check Docker GPU support
docker info | grep -i gpu

パス変換の問題(Git Bash):

# Set MSYS_NO_PATHCONV
MSYS_NO_PATHCONV=1 docker run ...

# Or add to ~/.bashrc
export MSYS_NO_PATHCONV=1

メモリ不足:

# Increase memory limit
docker run --rm --memory="8g" --memory-swap="8g" ...

# Use streaming mode
docker run --rm \
  -v $(pwd):/data \
  jrottenberg/ffmpeg:7.1-ubuntu2404 \
  -i /data/input.mp4 \
  -f segment -segment_time 60 \
  /data/output_%03d.mp4
デバッグコマンド
# Enter container shell
docker run --rm -it \
  --entrypoint /bin/bash \
  jrottenberg/ffmpeg:7.1-ubuntu2404

# Check FFmpeg version and capabilities
docker run --rm jrottenberg/ffmpeg:7.1-ubuntu2404 -version
docker run --rm jrottenberg/ffmpeg:7.1-ubuntu2404 -encoders
docker run --rm jrottenberg/ffmpeg:7.1-ubuntu2404 -hwaccels

ベストプラクティス

  1. イメージのバージョンを固定する - latest ではなく、特定のタグを使用します
  2. 入力ファイルには読み取り専用のマウントを使用する
  3. ホストのリソース枯渇を防ぐため、リソースを制限する
  4. カスタムイメージにはマルチステージビルドを使用する
  5. コンテナーのログ記録にはstdout/stderr に出力する
  6. 長時間実行するサービスにはヘルスチェックを設定する
  7. --rm フラグを使用してコンテナーをクリーンアップする
  8. セキュリティ - 可能な場合は、root 以外のユーザーとして実行します

このガイドでは、Docker FFmpeg のパターンを説明します。ハードウェアアクセラレーションの詳細については、ハードウェアアクセラレーションのスキルを参照してください。

コメント