Clone Docker images to your private registry
INFO
Part of airgapped deployment
This guide is part of the airgapped deployment process. If you're setting up Plane in an airgapped environment, return to that guide after copying your images.
This guide shows you how to copy Docker images from the Plane artifact registry to your destination registry using the crane tool.
Prerequisites
Install crane
Crane is a tool for interacting with remote container images and registries. Install it on a machine with internet access.
macOS:
brew install craneLinux:
# Download the latest release
VERSION=$(curl -s https://api.github.com/repos/google/go-containerregistry/releases/latest | grep '"tag_name"' | cut -d'"' -f4)
curl -sL "https://github.com/google/go-containerregistry/releases/download/${VERSION}/go-containerregistry_Linux_x86_64.tar.gz" | tar xz crane
sudo mv crane /usr/local/bin/
# Verify installation
crane versionWindows (using WSL or Git Bash):
# Download and extract
curl -sL "https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Windows_x86_64.tar.gz" | tar xz crane.exePlane images to copy
The following Plane Commercial images need to be transferred to your private registry:
artifacts.plane.so/makeplane/admin-commercial:${APP_RELEASE_VERSION}
artifacts.plane.so/makeplane/web-commercial:${APP_RELEASE_VERSION}
artifacts.plane.so/makeplane/space-commercial:${APP_RELEASE_VERSION}
artifacts.plane.so/makeplane/live-commercial:${APP_RELEASE_VERSION}
artifacts.plane.so/makeplane/monitor-commercial:${APP_RELEASE_VERSION}
artifacts.plane.so/makeplane/backend-commercial:${APP_RELEASE_VERSION}
artifacts.plane.so/makeplane/iframely:v1.2.0
artifacts.plane.so/makeplane/silo-commercial:${APP_RELEASE_VERSION}
artifacts.plane.so/makeplane/email-commercial:${APP_RELEASE_VERSION}WARNING
Infrastructure images not included: The Plane artifact registry does not include infrastructure images. If you're using local_setup: true for any infrastructure services, you'll need to pull these separately from public registries:
valkey/valkey:7.2.11-alpinepostgres:15.7-alpinerabbitmq:3.13.6-management-alpineminio/minio:latestminio/mc:latest
Configure environment variables
Set your version and destination registry before copying images.
# Set your Plane version
export APP_RELEASE_VERSION="v2.1.0" # Replace with your desired version
# Set your destination registry
export DESTINATION_REGISTRY="your-registry.io/your-namespace"Example destination registry values:
# Docker Hub
export DESTINATION_REGISTRY="docker.io/yourcompany"
# Google Container Registry
export DESTINATION_REGISTRY="gcr.io/your-project"
# Private registry
export DESTINATION_REGISTRY="your-private-registry.com/plane"
# AWS ECR
export DESTINATION_REGISTRY="123456789012.dkr.ecr.us-east-1.amazonaws.com/plane"
# Azure Container Registry
export DESTINATION_REGISTRY="yourregistry.azurecr.io/plane"Authenticate to your destination registry
Before copying images, authenticate crane to your destination registry.
Docker Hub:
crane auth login docker.io -u YOUR_USERNAME -p YOUR_PASSWORDGoogle Container Registry:
gcloud auth configure-dockerAWS ECR:
aws ecr get-login-password --region REGION | crane auth login --username AWS --password-stdin AWS_ACCOUNT_ID.dkr.ecr.REGION.amazonaws.comAzure Container Registry:
az acr login --name YOUR_REGISTRY_NAMEHarbor or other private registries:
crane auth login your-registry.com -u YOUR_USERNAME -p YOUR_PASSWORDCopy images to your registry
You can copy images individually or use the provided script to copy all images at once.
Option 1: Copy individual images
Basic image copy:
crane copy \
artifacts.plane.so/makeplane/backend-commercial:${APP_RELEASE_VERSION} \
${DESTINATION_REGISTRY}/backend-commercial:${APP_RELEASE_VERSION}Copy with specific platform (architecture):
crane copy \
--platform linux/amd64 \
artifacts.plane.so/makeplane/backend-commercial:${APP_RELEASE_VERSION} \
${DESTINATION_REGISTRY}/backend-commercial:${APP_RELEASE_VERSION}Verify source image before copying:
# Check if source image exists
crane manifest artifacts.plane.so/makeplane/backend-commercial:${APP_RELEASE_VERSION}
# List all available tags
crane ls artifacts.plane.so/makeplane/backend-commercialVerify image after copying:
# Get image digest
crane digest ${DESTINATION_REGISTRY}/backend-commercial:${APP_RELEASE_VERSION}
# Verify manifest
crane manifest ${DESTINATION_REGISTRY}/backend-commercial:${APP_RELEASE_VERSION}Option 2: Copy all images with a script
Create a file named copy-plane-images.sh:
#!/bin/bash
set -e
# Configuration
APP_RELEASE_VERSION="${APP_RELEASE_VERSION:-v2.1.0}"
DESTINATION_REGISTRY="${DESTINATION_REGISTRY}"
if [ -z "$DESTINATION_REGISTRY" ]; then
echo "Error: DESTINATION_REGISTRY environment variable is not set"
echo "Example: export DESTINATION_REGISTRY='docker.io/yourcompany'"
exit 1
fi
# Source registry
SOURCE_REGISTRY="artifacts.plane.so/makeplane"
# Image list
declare -a IMAGES=(
"admin-commercial:${APP_RELEASE_VERSION}"
"web-commercial:${APP_RELEASE_VERSION}"
"space-commercial:${APP_RELEASE_VERSION}"
"live-commercial:${APP_RELEASE_VERSION}"
"monitor-commercial:${APP_RELEASE_VERSION}"
"backend-commercial:${APP_RELEASE_VERSION}"
"iframely:v1.2.0"
"silo-commercial:${APP_RELEASE_VERSION}"
"email-commercial:${APP_RELEASE_VERSION}"
)
echo "Starting image copy process..."
echo "Source: ${SOURCE_REGISTRY}"
echo "Destination: ${DESTINATION_REGISTRY}"
echo "Version: ${APP_RELEASE_VERSION}"
echo ""
# Copy each image
for IMAGE in "${IMAGES[@]}"; do
SOURCE="${SOURCE_REGISTRY}/${IMAGE}"
DESTINATION="${DESTINATION_REGISTRY}/${IMAGE}"
echo "Copying: ${SOURCE} -> ${DESTINATION}"
crane copy "${SOURCE}" "${DESTINATION}"
if [ $? -eq 0 ]; then
echo "✓ Successfully copied ${IMAGE}"
else
echo "✗ Failed to copy ${IMAGE}"
exit 1
fi
echo ""
done
echo "All images copied successfully!"Make the script executable and run it:
chmod +x copy-plane-images.sh
./copy-plane-images.shThe script will copy all Plane images to your destination registry. Each image copy is verified, and the script exits if any copy fails.
Troubleshooting
Authentication issues
Error: unauthorized: authentication required
Solution: Re-authenticate to your destination registry:
crane auth login your-destination-registry.comVerify your credentials are correct and that you have push permissions to the registry.
Network timeouts
Error: Large images timing out during transfer
Solution: Crane handles retries automatically, but you can also:
- Check your network connection stability
- Try copying during off-peak hours
- Use a machine with better network connectivity
- Copy images individually rather than using the batch script
Permission denied
Error: denied: requested access to the resource is denied
Solution:
- Ensure you have push permissions to the destination registry
- Verify your authentication credentials are correct
- Check that the destination repository exists, or that you have permission to create it
- For organizational registries, confirm your account has the necessary roles
Image not found
Error: MANIFEST_UNKNOWN: manifest unknown
Solution:
- Verify the source image exists:
crane ls artifacts.plane.so/makeplane/backend-commercial- Check that you're using the correct version tag
- Ensure
APP_RELEASE_VERSIONis set correctly - Verify the image name is spelled correctly
Rate limiting
Error: 429 Too Many Requests
Solution:
- Wait a few minutes and retry
- Authenticate to increase rate limits
- For Docker Hub, ensure you're using an authenticated account (free accounts have higher limits than anonymous)
- Spread out image copies over time if hitting limits repeatedly

