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.
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
Install Pipe
go install github.com/bjarneo/pipe@latest
Or download a binary from the releases page.
Create a Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Deploy
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:
go install github.com/bjarneo/pipe@latest
Download Binary
Pre-built binaries for Linux, macOS, and Windows:
# 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:
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
Minimal Config File
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.
Examples
Common deployment patterns
Basic Deploy
pipe --host server.com --user deploy
With Environment Variables
pipe --host server.com --user deploy \
--env NODE_ENV=production \
--env LOG_LEVEL=info \
--env-file .env.production
With Volumes
pipe --host server.com --user deploy \
--volume /data:/app/data \
--volume /logs:/app/logs
JSON Output for CI/CD
# 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
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
# 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.