Docker Run and Podman Run to Quadlet Converter
Translate single-line or backslash-wrapped docker run and podman run commands into maintainable Quadlet .container unit files. CLI flags for published ports, bind mounts, environment variables, hardware devices, and Linux capabilities map directly to documented unit keys.
systemd Deployment & Reload Commands
mkdir -p ~/.config/containers/systemd systemctl --user daemon-reload && systemctl --user start jellyfin.service systemctl --user status jellyfin.service loginctl enable-linger $USER
Technical notes for Docker Run to Quadlet
-
01
Multi-line shell snippets using trailing backslashes are joined and tokenized in the browser before flag extraction.
-
02
Repeated -p, -v, -e, --device, --cap-add, and --cap-drop flags emit individual PublishPort=, Volume=, Environment=, AddDevice=, AddCapability=, and DropCapability= lines.
-
03
Container names supplied via --name determine both ContainerName= and the output .container filename.
-
04
Hardware acceleration flags such as --device /dev/dri/renderD128:/dev/dri/renderD128 convert directly to AddDevice= for Jellyfin, Plex, or Frigate workloads.
Syntax Mapping Reference
Compose Key -> Quadlet Directive Cheat Sheet
Quick lookup for how Compose YAML fields and docker or podman run flags translate into Podman systemd unit directives.
| Compose Key / CLI Flag | Unit Section | Quadlet Directive | Linux systemd Behavior |
|---|---|---|---|
| services.<app>.image | [Container] | Image=docker.io/library/... | Use a fully qualified registry host when AutoUpdate=registry is enabled. |
| ports: ["8080:80"] / -p | [Container] | PublishPort=8080:80 | Repeats once per published host port; supports bind IP and /udp protocol suffixes. |
| volumes: ["./data:/data"] / -v | [Container] + .volume | Volume=/srv/data:/data:Z | Named volumes map to <name>.volume units; bind mounts append :z or :Z on SELinux hosts. |
| environment / env_file / -e | [Container] | Environment= / EnvironmentFile= | Sensitive password, token, and key entries extract into <stack>.env with chmod 600. |
| depends_on | [Unit] | After=<dep>.service + Requires= | Starts PostgreSQL, MariaDB, and Redis units before dependent web or worker units. |
| networks (or stack default) | [Container] + .network | Network=<stack>.network | Creates an aardvark-dns bridge so peer containers resolve each other by service name. |
| restart: unless-stopped | [Service] + [Install] | Restart=always + WantedBy= | systemd restarts crashed containers and launches units on boot or user linger. |
| healthcheck.test / interval | [Container] | HealthCmd= / HealthInterval= | Translates CMD and CMD-SHELL probes along with retries, timeout, and start_period. |
| devices / cap_add / user | [Container] | AddDevice= / AddCapability= / User= | Passes /dev/dri GPU render nodes and scoped Linux capabilities without --privileged. |
| io.containers.autoupdate | [Container] | AutoUpdate=registry | Works with podman-auto-update.timer to pull newer image digests and roll services. |
Frequently asked questions
- Which docker run and podman run flags does the converter recognize?
- It parses --name, -p/--publish, -v/--volume, -e/--env, --env-file, --network, --restart, -u/--user, --workdir/-w, --hostname, --entrypoint, --device, --cap-add, --cap-drop, -l/--label, --shm-size, --privileged, and trailing image plus command arguments.
- What happens to -d or --detach and --rm flags from docker run?
- Quadlet manages foreground attachment and post-stop container cleanup natively through podman-system-generator, so -d and --rm are stripped cleanly rather than duplicated.
- How do I pass Intel QuickSync or AMD VAAPI GPU devices in a rootless Quadlet?
- Include --device /dev/dri in your run command so AddDevice=/dev/dri appears under [Container], and add GroupAdd=keep-groups if your host user belongs to the render and video groups.
- Can I switch from a single docker run command to a multi-container Compose file in the same editor?
- Yes. The parser inspects your input automatically on every keystroke and switches between docker-run and compose-yaml modes without losing your scope or SELinux settings.
Focused Workflows
Related Podman Quadlet Generators & Guides
Switch to another browser-local QuadletGen preset or read the systemd dry-run verification guide.
Docker Compose to Podman Quadlet Converter
Free browser-local Docker Compose to Quadlet converter. Compile compose.yaml into Podman systemd .container, .network, .volume, and .env ZIP units.
Podman Quadlet Generator for Declarative systemd Services
Interactive Podman Quadlet generator for declarative systemd services. Configure AutoUpdate=registry, health checks, rootless paths, and .env files.
Rootless Podman Quadlet Volume and SELinux Label Generator
Configure rootless Podman Quadlet volume z and Z bind mount labels for Fedora, RHEL, Bluefin, and CoreOS without permission denied container errors.
Podman Quadlet Examples for Immich, Nextcloud, and Vaultwarden
Ready-to-deploy Podman Quadlet Docker Compose examples for Immich, Nextcloud, Vaultwarden, and Postgres stacks with shared DNS networks and volumes.
Podlet Online Multi-Container Quadlet Network and ZIP Packager
Run a Podlet online workflow in your browser without Cargo or Rust. Package Compose stacks into linked .container, .network, .volume, and .env ZIPs.
QuadletGen Conversion Rules and systemd Dry-Run Verification
Review how QuadletGen synthesizes .container, .network, .volume, and .env units locally and how to verify syntax with podman/quadlet --dryrun.
How QuadletGen compares with containers/podlet CLI and Podman Desktop
Choose the right workflow for converting Compose stacks and container commands into Podman systemd units.
| Capability | QuadletGen (Web) | containers/podlet CLI | Podman Desktop |
|---|---|---|---|
| Host setup required | Zero installation in any browser | Rust Cargo build, distro package, or container image | Desktop GUI plus local Podman machine and extension |
| Multi-file stack preview | Live unit tabs, combined view, and one-click .zip bundle | Writes separate files to disk or stdout per CLI run | Inspects running local pods or containers one by one |
| Shared .network synthesis | Automatic <stack>.network generation on toggle | Converts declared Compose networks via CLI flags | Depends on existing local Podman network state |
| SELinux :z and :Z volume toggle | Instant switch across none, shared :z, and private :Z | Manual volume string editing in input YAML or flags | Manual edit after generating the unit file |
| Secret .env extraction | Extracts sensitive keys into <stack>.env with EnvironmentFile= | Preserves inline environment entries unless pre-split | Inline Environment= lines by default |
| Data privacy | 100% client-side JavaScript with zero server uploads | Local binary execution | Local desktop execution |