Ready-to-use Docker image for yt-dlp
8.9K
yt-dlp Docker ImageReady-to-use container image for the upstream yt-dlp CLI with ffmpeg, ffprobe, deno, AtomicParsley, and curl_cffi included.
| Component | Purpose |
|---|---|
yt-dlp | official Linux release binary from yt-dlp/yt-dlp |
ffmpeg and ffprobe | merging and post-processing |
deno | JavaScript runtime for bundled EJS support |
AtomicParsley | thumbnail embedding fallback for mp4 and m4a |
curl_cffi | browser impersonation support used by some sites |
| non-root user | safer default runtime |
linux/amd64 and linux/arm64 | multi-architecture images |
| Registry | Image |
|---|---|
| GHCR | ghcr.io/friedrichrehren/yt-dlp |
| Docker Hub | friedrichrehren/yt-dlp |
The latest image follows the newest upstream yt-dlp release. Versioned image
tags match upstream release tags such as 2026.03.17. A separate nightly tag
is rebuilt from the upstream nightly channel on each scheduled run and
replaces the previous nightly image.
This project watches upstream yt-dlp releases and republishes them as Docker
images.
The repository automation:
yt-dlp/yt-dlp once an houryt-dlp, ffmpeg, deno) before it is pushednightly image once per day from the upstream nightly
channel and replaces the previous nightly tagThe container itself is intentionally simple. Its entrypoint is yt-dlp, so the
image behaves like a containerized yt-dlp CLI with the upstream recommended
runtime pieces already present.
Both registries publish the same tags and multi-arch images. Choose the one you prefer:
Image: ghcr.io/friedrichrehren/yt-dlp
Pull the image from GHCR:
docker pull ghcr.io/friedrichrehren/yt-dlp:latest
Or use the upstream nightly channel tag:
docker pull ghcr.io/friedrichrehren/yt-dlp:nightly
Check the installed version:
docker run --rm ghcr.io/friedrichrehren/yt-dlp:latest --version
Image: friedrichrehren/yt-dlp
Pull the image from Docker Hub:
docker pull friedrichrehren/yt-dlp:latest
Or use the upstream nightly channel tag:
docker pull friedrichrehren/yt-dlp:nightly
Check the installed version:
docker run --rm friedrichrehren/yt-dlp:latest --version
Because the container entrypoint is already yt-dlp, everything after the image
name is passed directly to yt-dlp.
Image: ghcr.io/friedrichrehren/yt-dlp
Download into a host directory:
docker run --rm \
-v /path/to/downloads:/downloads \
ghcr.io/friedrichrehren/yt-dlp:latest \
https://www.youtube.com/watch?v=example
Use a pinned yt-dlp version:
docker run --rm \
-v /path/to/downloads:/downloads \
ghcr.io/friedrichrehren/yt-dlp:2026.03.17 \
--version
Merge audio and video with the bundled ffmpeg:
docker run --rm \
-v /path/to/downloads:/downloads \
ghcr.io/friedrichrehren/yt-dlp:latest \
--format "bv*+ba/b" \
--merge-output-format mp4 \
https://www.youtube.com/watch?v=example
Extract audio:
docker run --rm \
-v /path/to/downloads:/downloads \
ghcr.io/friedrichrehren/yt-dlp:latest \
--extract-audio \
--audio-format mp3 \
https://www.youtube.com/watch?v=example
Image: friedrichrehren/yt-dlp
Download into a host directory:
docker run --rm \
-v /path/to/downloads:/downloads \
friedrichrehren/yt-dlp:latest \
https://www.youtube.com/watch?v=example
Use a pinned yt-dlp version:
docker run --rm \
-v /path/to/downloads:/downloads \
friedrichrehren/yt-dlp:2026.03.17 \
--version
Merge audio and video with the bundled ffmpeg:
docker run --rm \
-v /path/to/downloads:/downloads \
friedrichrehren/yt-dlp:latest \
--format "bv*+ba/b" \
--merge-output-format mp4 \
https://www.youtube.com/watch?v=example
Extract audio:
docker run --rm \
-v /path/to/downloads:/downloads \
friedrichrehren/yt-dlp:latest \
--extract-audio \
--audio-format mp3 \
https://www.youtube.com/watch?v=example
Build the latest upstream yt-dlp release:
docker build -t yt-dlp:latest .
Build a specific upstream release:
docker build \
--build-arg YTDLP_VERSION=2026.03.17 \
-t yt-dlp:2026.03.17 .
YTDLP_VERSION: upstream yt-dlp release tag to download. Defaults to
latest. Set it to nightly to download the upstream nightly build channel
instead of a tagged stable release.PYTHON_IMAGE: base image to build from. Defaults to python:3.14-slim.DENO_VERSION: Deno release to install for JavaScript execution. Defaults to
2.6.4.Example with an explicit base image:
docker build \
--build-arg PYTHON_IMAGE=python:3.14-slim \
--build-arg YTDLP_VERSION=latest \
-t yt-dlp:custom .
The image:
ffmpeg from Debian packagesffprobe from the same Debian package setAtomicParsleydeno for JavaScript executioncurl_cffiyt-dlp binary during build65532/downloads as the working directoryThat means mounted download paths should normally target /downloads.
| Workflow | Trigger | Purpose |
|---|---|---|
check-upstream.yml | hourly, manual | publishes new upstream releases (<version> and latest) |
deploy-nightly.yml | daily, manual | rebuilds the nightly tag |
deploy-manual.yml | manual | builds a specific release, optionally as latest or for one registry only |
deploy.yml | called by the workflows above | builds, smoke-tests and pushes the image |
sync-dockerhub-readme.yml | README change, after releases, manual | copies this README to Docker Hub |
keepalive.yml | weekly, manual | re-enables all scheduled workflows so GitHub does not disable them |
| Secret | Purpose |
|---|---|
DOCKERHUB_USERNAME | Docker Hub user |
DOCKERHUB_TOKEN | Docker Hub access token, scope Read & Write (image push) |
DOCKERHUB_README_TOKEN | optional: token with scope Read, Write, Delete – Docker Hub requires it to update the repository description. Falls back to DOCKERHUB_TOKEN |
Content type
Image
Digest
sha256:07b741e0a…
Size
271.3 MB
Last updated
3 days ago
docker pull friedrichrehren/yt-dlp