Skip to main content

Docker Swarm: Offline / Air-Gapped

The Docker Swarm installer supports a fully air-gapped install: bundle the exact image set on a machine with internet, copy the tarball across, and install with --offline. Nothing is pulled at deploy time.

Step 1 — save the images (on a connected host)

save-images.sh pulls the pinned image set and docker saves it into a single tarball. It honours the same version flags as the installer, so the bundle matches your intended install exactly:

deploy/docker/save-images.sh --output=elchi-images.tar
# honours --backend-version / --ui-version / --coredns-version /
# --collector-version / --image-repo, plus --platform and --output
FlagDefaultPurpose
--output=<path>elchi-images.tarOutput tarball path.
--platform=<os/arch>linux/amd64Target platform for the pulled images.
--backend-version=<csv>from versions.envBackend variant tag(s) to include.
--ui-version=<tag>from versions.envUI image tag.
--coredns-version=<tag>from versions.envCoreDNS image tag.
--collector-version=<tag>from versions.envCollector image tag.
--image-repo=<repo>jhonbrownnElchi image namespace / registry.
--no-collectorcollector onOmit the collector + ClickHouse images from the bundle.
--no-gslbGSLB onOmit the CoreDNS image from the bundle.

The script lists every image it wrote so you can verify the set before transferring.

Step 2 — copy the tarball

Move elchi-images.tar to the air-gapped host by whatever channel you use (USB, internal file share, scp over the isolated network, …).

Step 3 — install with --offline

Point the installer at the tarball:

sudo deploy/docker/install.sh --main-address=10.0.0.5 --offline=elchi-images.tar

--offline runs docker load -i <tarball> first and then deploys with --resolve-image=never, so Docker never reaches out to a registry.

Multi-node air-gapped installs

--offline docker loads only on the node it runs on. For a multi-node air-gapped cluster you have two options:

  1. Load on every node — copy the tarball to each node and docker load -i elchi-images.tar there (or let the tarball ride along and load it before the workers pull), then run the installer normally; or
  2. Run a local registry — stand up a throwaway registry:2, docker load the bundle and push the images to it, and set --image-repo=<registry>:<port> so every node pulls from your local mirror.

See High Availability for the multi-node model.