Skip to main content

Install with the pvr CLI

The pvr CLI lets you add a Docker Hub image as a Pantavisor container, commit the change locally, and deploy it to the device over the local network — all without touching the device directly.

Prerequisites: pvr installed on your workstation (install guide) and the device reachable on the local network.


1 — Clone the Device

Clone the device's current revision to your workstation. Pantavisor exposes its state over HTTP on port 12368.

pvr clone http://<device-ip>:12368/cgi-bin mydevice
cd mydevice

The checkout mirrors the live device state — all containers, their rootfs images, LXC configs, and manifests.

2 — Add the New Container

Use pvr app add to pull a Docker Hub image and convert it to a Pantavisor container. Specify --platform to match your device architecture.

# ARM64 device (e.g. Raspberry Pi 4, iMX8)
pvr app add tailscale --from tailscale/tailscale --platform linux/arm64

# ARM32 device (e.g. iMX6)
pvr app add tailscale --from tailscale/tailscale --platform linux/arm/v7

pvr app add pulls the image, converts it to a SquashFS rootfs, and creates the container's directory with:

tailscale/
├── root.squashfs ← container filesystem
├── root.squashfs.docker-digest ← image digest for update tracking
└── lxc.container.conf ← LXC runtime configuration

3 — Stage and Commit

Check what was added:

pvr status

Expected output:

A tailscale/lxc.container.conf
A tailscale/root.squashfs
A tailscale/root.squashfs.docker-digest

Stage and commit the new revision:

pvr add .
pvr commit -m "add Tailscale container"

4 — Deploy to the Device

Post the new revision to the device's pvr endpoint — the same URL you cloned from:

pvr post http://<device-ip>:12368

Pantavisor downloads the new container objects, writes them as a pending revision, and reboots. If the revision boots cleanly, it becomes the new permanent state.

5 — Verify

After the device reboots, confirm the container is running:

# From the device console (serial or SSH)
lxc-ls -f

# Or via pvcontrol
pvcontrol container ls

The new container should show as RUNNING. You can also check from the pvtx web UI at http://<device-ip>:12368/app.