Skip to content

Docker Build Optimization

Available Dockerfiles

Dockerfile Strategy Build time Use case
Dockerfile.prebuilt Downloads release binaries from GitHub ~30 s Production releases
Dockerfile.local Uses locally compiled binaries ~5 min Dev / custom builds
Dockerfile Compiles from source inside Docker ~1 hour Fallback

Downloads the pre-built release binary at image-build time. Requires a tagged release.

# Build for both platforms
./build-docker.sh -t prebuilt -v v1.0.0

# Build, tag, and push
./build-docker.sh -t prebuilt -v v1.0.0 --push --tag myregistry/mediaflow-proxy-light

Manual:

docker buildx build \
  -f Dockerfile.prebuilt \
  --platform linux/amd64,linux/arm64 \
  --build-arg RELEASE_VERSION=v1.0.0 \
  -t mediaflow-proxy-light:v1.0.0 \
  .

Dockerfile.local (dev workflow)

Packages locally compiled binaries — no internet needed during the Docker build.

# 1. Compile for both targets
cargo build --release --target x86_64-unknown-linux-gnu
cargo build --release --target aarch64-unknown-linux-gnu

# 2. Build Docker images
./build-docker.sh -t local

Manual:

docker buildx build \
  -f Dockerfile.local \
  --platform linux/amd64 \
  --build-arg BINARY_PATH=target/x86_64-unknown-linux-gnu/release/mediaflow-proxy-light \
  -t mediaflow-proxy-light:dev \
  .

GitHub Actions

The release workflow uses Dockerfile.prebuilt:

- name: Build and push
  uses: docker/build-push-action@v5
  with:
    context: .
    file: ./Dockerfile.prebuilt
    platforms: linux/amd64,linux/arm64
    build-args: |
      RELEASE_VERSION=${{ steps.version.outputs.RELEASE_VERSION }}

Runtime image

All Dockerfiles use gcr.io/distroless/cc-debian12 as the runtime base — a minimal image (~12 MB) with no shell or package manager.

Docker Compose with Redis

services:
  proxy:
    image: ghcr.io/mhdzumair/mediaflow-proxy-light:latest
    ports:
      - "8888:8888"
    environment:
      APP__AUTH__API_PASSWORD: "your-secure-password"
      APP__REDIS__URL: "redis://redis:6379"
    depends_on:
      - redis
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    command: redis-server --save "" --appendonly no
    restart: unless-stopped