Docker Image
Deploy any pre-built image from a registry — no build step.
The simplest possible deploy — pick a Docker image by name, set the port and any env vars, and ship. Pier pulls the image, runs the container, attaches it to Traefik for HTTPS, and gives you logs / restart / env controls. No build, no Dockerfile, no Compose.
Deploy with Pier
- 1 Open the Pier dashboard and click Add service.
- 2 Pick Docker Image from the template list.
- 3 Choose the version, set a service name, and Pier provisions the container, storage, and ports automatically.
- 4 Attach a domain if you want HTTPS. Traefik auto-provisions the Let's Encrypt certificate.
What is Docker Image on Pier?
The most stripped-down deploy template — paste a Docker image reference,
set ports / env vars / volumes / domain, and Pier runs it. No Dockerfile,
no Compose YAML, no build step. Useful any time someone says “docker pull
this image and run it” and you’d like the result to be a managed Pier
service rather than a hand-rolled docker run on the host.
Pier wires the container into its Traefik-fronted network for HTTPS, manages volumes you declare, exposes env-var and command overrides, and gives you the same logs / restart / redeploy controls you get with native templates.
How Pier deploys it
You give Pier the image name (e.g. nginx:latest or
ghcr.io/your-org/your-app:v1.2.3), the internal port the image listens
on, optional volumes and env vars, and a domain.
Pier pulls the image, starts the container with the configured volumes and env, attaches Traefik routes for HTTPS termination at the chosen domain, and persists the container across host restarts.
For private registries, add credentials in Pier Settings → Registries before deploying — Pier uses them when pulling.
Updates — click Redeploy to force a fresh pull of the configured tag. To upgrade to a new version, edit the image reference and redeploy.
When NOT to use Docker Image
When you have source code but no pre-built image, use the Dockerfile or Railpack template — they build for you. When the service is multi-container, use Docker Compose. When a native Pier template exists for the service (PostgreSQL, Gitea, Grafana, …), the dedicated template comes with managed backups, version selectors, and lifecycle features the generic template doesn’t have.
Key features
Any image from any registry
Docker Hub, GitHub Container Registry (ghcr.io), Quay, GitLab Registry, AWS ECR, Google Artifact Registry — anything pullable works.
One field — the image name
nginx:latest, postgres:17-alpine, ghcr.io/your-org/your-app:v1.2.3 — paste the image reference, that's it.
Env vars, ports, volumes
Pier UI for adding env vars, mapping ports, attaching persistent volumes. Same controls as native templates.
Private registry auth
Add registry credentials in Pier; subsequent pulls authenticate. Per-registry credentials supported.
HTTPS via Traefik
Attach a custom domain and Traefik handles TLS termination. No reverse proxy to configure.
Logs + restart + redeploy
Tail logs, restart, force a fresh pull-and-deploy of the same tag (or pin a digest) from the UI.
Use cases
Off-the-shelf services
nginx, postgres, redis, any community-maintained image — deploy without writing config.
Your own pre-built images
CI builds an image and pushes to ghcr.io / your registry. Pier pulls and runs.
Trying community projects
A GitHub project says "docker pull foo/bar". You paste foo/bar:latest into Pier and have it running.
Lightweight sidecars
A single small image — backup runner, log shipper, metric exporter, tunnel — deployed alongside your other services.
Fast prototyping
Spin up an image, test, destroy. The image-name dropdown is the fastest path to a running container.
Code examples
Image: nginx:latest
Internal port: 80
Domain: site.example.com (attach in Pier)
→ Pier pulls, runs, fronts with HTTPS Image: ghcr.io/your-org/my-api:v2.3.0
Internal port: 8080
Env vars:
DATABASE_URL = postgres://...
API_KEY = sk-...
Volume: /app/uploads → pier-managed Pier Settings → Registries → Add
Registry: ghcr.io
Username: your-org-bot
Password: <PAT with read:packages scope>
Subsequent pulls authenticate automatically. Image: nginx@sha256:abcdef0123...
→ Pier pulls this exact digest forever — no "latest" surprises How it compares
| vs Dockerfile (this catalog) | Dockerfile builds an image from your source. Docker Image runs a pre-built image you already have. Use Image when CI builds for you; Dockerfile when you want Pier to build. |
| vs Railpack (this catalog) | Railpack auto-detects your language and builds without a Dockerfile. Docker Image runs an image you've already built elsewhere. Different points in the build/deploy chain. |
| vs Docker Compose (this catalog) | Compose runs multiple containers together. Docker Image runs one. Use Image for single-service apps; Compose for multi-service. |
| vs Native Pier templates | Native templates (PostgreSQL, Gitea, Grafana, ...) come pre-wired with backups, version selectors, scaling features. Docker Image is the generic escape hatch for anything not natively templated. |
Frequently asked questions
What if the image needs special args / commands?
How do volumes work?
Can I pin a specific tag or digest?
Resource limits?
How does Traefik routing work?
Private images?
How to update?
Related services
Deploy on your VPS
The simplest possible deploy — pick a Docker image by name, set the port and any env vars, and ship. Pier pulls the image, runs the container, attaches it to Traefik for HTTPS, and gives you logs / restart / env controls. No build, no Dockerfile, no Compose.
Deploy this service →