Open Source CLI Tool

Deploy Docker images
without a registry

Pipe transfers Docker images directly to remote hosts via SSH.
Delta transfers send only changed layers. No registry setup required.

terminal
$ pipe --host server.com --user deploy
[1/4] Building image... done
[2/4] Analyzing layers... 3 changed, 12 cached
[3/4] Transferring delta... 47MB (saved 312MB)
[4/4] Starting container... running
Deployed in 23.4s

Why Pipe?

Simple deployment without the infrastructure overhead

Delta Transfers

Only changed Docker layers are transferred. Redeploys typically send just megabytes instead of the full image.

No Registry Required

Skip Docker Hub, ECR, or self-hosted registries. Images go directly from your machine to the server via SSH.

Zero Configuration

Works with a single command. Add a config file when you need more control over builds and containers.

Built-in Rollback

One command to roll back to the previous deployment. Version your tags and Pipe handles the rest.

Full Docker Support

Health checks, resource limits, volumes, networks, capabilities, logging drivers—all configurable.

CI/CD Ready

Environment variables, JSON output for automation, and dry-run mode for testing pipelines.

Quick Start

Deploy your first container in under a minute

1

Install Pipe

bash
go install github.com/bjarneo/pipe@latest

Or download a binary from the releases page.

2

Create a Dockerfile

Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
3

Deploy

bash
pipe --host server.com --user deploy

That's it. Your container is running on port 3000.

Installation

Multiple ways to get Pipe on your system

Go Install

If you have Go 1.21+ installed:

bash
go install github.com/bjarneo/pipe@latest

Download Binary

Pre-built binaries for Linux, macOS, and Windows:

bash
# Download latest release
curl -sL https://github.com/bjarneo/pipe/releases/latest/download/pipe_linux_amd64 -o pipe
chmod +x pipe
sudo mv pipe /usr/local/bin/

Build from Source

Clone and build the latest version:

bash
git clone https://github.com/bjarneo/pipe.git
cd pipe
go build -o pipe .
sudo mv pipe /usr/local/bin/

Requirements

  • Local: Docker installed and running
  • Remote: SSH access and Docker installed on the target host

Configuration

CLI flags, environment variables, or YAML config files

Priority Order

1
CLI Flags Highest priority, overrides everything
2
Environment Variables Good for CI/CD and secrets
3
Config File Project defaults in pipe.yaml

Minimal Config File

pipe.yaml
host: server.com
user: deploy
image: my-app
containerPort: "3000"
hostPort: "3000"

Common Options

Flag Env Variable Description
--host HOST Remote host required
--user HOST_USER SSH username
--image DOCKER_IMAGE_NAME Docker image name
--tag DOCKER_IMAGE_TAG Image tag (default: latest)
--container-port DOCKER_CONTAINER_PORT Port inside container
--host-port HOST_PORT Port on host
--env Environment variable (repeatable)
--volume DOCKER_VOLUMES Volume mount (repeatable)
--dry-run DRY_RUN Preview without changes
--json JSON_OUTPUT Output stats as JSON
--rollback Rollback to previous version

See the full configuration reference for all options, or CI/CD integration for GitHub Actions and GitLab CI examples.

Delta Transfers

How Pipe saves bandwidth and time

Docker images are composed of layers. When you rebuild an image, typically only a few layers change—your application code—while base images and dependencies stay the same.

Pipe compares layers between your local image and the remote host, then transfers only the layers that have changed.

~85% Less data transferred on typical redeploys
3-5x Faster deployments compared to full image push
Full Image
Base OS (50MB)
Runtime (120MB)
Dependencies (180MB)
App Code (9MB)
Total: 359MB
Delta Transfer
Cached
Cached
Cached
App Code (9MB)
Transferred: 9MB

Examples

Common deployment patterns

Basic Deploy

bash
pipe --host server.com --user deploy

With Environment Variables

bash
pipe --host server.com --user deploy \
  --env NODE_ENV=production \
  --env LOG_LEVEL=info \
  --env-file .env.production

With Volumes

bash
pipe --host server.com --user deploy \
  --volume /data:/app/data \
  --volume /logs:/app/logs

JSON Output for CI/CD

bash
# Output JSON stats
pipe --json

# Pipe to jq for processing
pipe --json | jq '.timing.duration'

# Or use env var
JSON_OUTPUT=true pipe

Production Config File

pipe.yaml
host: prod.example.com
user: deploy
image: my-app
tag: ${VERSION:-latest}

containerName: my-app
containerPort: "3000"
hostPort: "80"
restartPolicy: unless-stopped

healthCmd: "curl -f http://localhost:3000/health || exit 1"
healthInterval: "30s"
healthTimeout: "10s"
healthRetries: 3

cpus: "1"
memory: "512m"

env:
  NODE_ENV: production

Rollback

bash
# Deploy with version tags
pipe --tag v1.0.0

# Later, deploy a new version
pipe --tag v1.0.1

# Something went wrong? Roll back
pipe --rollback

Ready to simplify your deployments?

Get started with Pipe in seconds. No registry setup required.