{"id":19675092,"url":"https://github.com/mesosphere/mindthegap","last_synced_at":"2026-01-08T11:12:36.410Z","repository":{"id":36968732,"uuid":"438336630","full_name":"mesosphere/mindthegap","owner":"mesosphere","description":"Easily create and use bundles for air-gapped environments","archived":false,"fork":false,"pushed_at":"2025-04-22T11:58:16.000Z","size":3476,"stargazers_count":74,"open_issues_count":2,"forks_count":11,"subscribers_count":19,"default_branch":"main","last_synced_at":"2025-04-22T12:36:33.186Z","etag":null,"topics":["airgapped","docker","kubernetes","oci-image","restricted-environments"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mesosphere.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-12-14T17:10:32.000Z","updated_at":"2025-04-22T11:40:36.000Z","dependencies_parsed_at":"2023-02-19T05:00:59.193Z","dependency_job_id":"a303be07-ee99-412c-8cdd-b9f5ba5af958","html_url":"https://github.com/mesosphere/mindthegap","commit_stats":null,"previous_names":[],"tags_count":95,"template":false,"template_full_name":"d2iq-archive/golang-repository-template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mesosphere%2Fmindthegap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mesosphere%2Fmindthegap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mesosphere%2Fmindthegap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mesosphere%2Fmindthegap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mesosphere","download_url":"https://codeload.github.com/mesosphere/mindthegap/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251420868,"owners_count":21586694,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["airgapped","docker","kubernetes","oci-image","restricted-environments"],"created_at":"2024-11-11T17:21:17.825Z","updated_at":"2026-01-08T11:12:36.404Z","avatar_url":"https://github.com/mesosphere.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!--\n Copyright 2021 D2iQ, Inc. All rights reserved.\n SPDX-License-Identifier: Apache-2.0\n--\u003e\n\n\u003ch1 align=\"center\"\u003e\u003cimg src=\"mindthegap.svg\" alt=\"mindthegap\" width=\"300\"/\u003e\u003c/h1\u003e\n\n![GitHub](https://img.shields.io/github/license/mesosphere/mindthegap?style=flat-square)\n\n`mindthegap` provides utilities to manage air-gapped image bundles, both\ncreating image bundles and seeding images from a bundle into an existing\nOCI registry.\n\n## Usage\n\n### Creating a bundle\n\n```shell\nmindthegap create bundle \\\n  [--images-file \u003cpath/to/images.yaml\u003e] \\\n  [--platform \u003cplatform\u003e [--platform \u003cplatform\u003e ...]] \\\n  [--all-platforms] \\\n  [--helm-charts-file \u003cpath/to/helm-charts.yaml\u003e] \\\n  [--oci-artifacts-file \u003cpath/to/helm-charts.yaml\u003e] \\\n  [--output-file \u003cpath/to/output.tar\u003e]\n```\n\nSee the [example images.yaml](images-example.yaml) for the structure of the\nimages config file. You can also provide the images file in a simple file with\nan image per line, e.g.\n\n```plain\nnginx:1.21.5\ntest.registry2.io/test-image6:atag\n```\n\nNote that images from Docker Hub must be prefixed with `docker.io` and those \"official\" images\nmust have the `library` namespace specified.\n\nPlatform can be specified multiple times. Supported platforms:\n\n```plain\nlinux/amd64\nlinux/arm64\nwindows/amd64\nwindows/arm64\n```\n\nAlternatively use the `--all-platforms` flag to bundle images for all platforms specified in the origin manifests.\n\nAll images in the images config file must support all the requested platforms.\n\nThe output file will be a tarball that can be seeded into a registry,\nor that can be untarred and used as the storage directory for an OCI registry\nserved via `registry:2`.\n\nSee the [example helm-charts.yaml](helm-example.yaml) for the structure of the\nHelm charts config file.  You can also provide the images file in a simple file with\na chart URL per line, e.g.\n\n```plain\noci://ghcr.io/stefanprodan/charts/podinfo:6.1.0\n```\n\nIt is also possible to include OCI artifacts that are not OCI images.\nThis is useful for bundling Flux kustomizations, Helm Charts directly from OCI\nregistries, and any arbitrary OCI artifacts. To include an OCI artifacts, specify\nthe `--oci-artifacts-file` path. The format of the provided file matches the\n`--images-file` format. The `--platform` flag has no effect on OCI artifacts.\n\nThe OCI artifacts with image index are not supported.\n\n### Pushing a bundle\n\n```shell\nmindthegap push bundle --bundle \u003cpath/to/bundle.tar\u003e \\\n  --to-registry \u003cregistry.address\u003e \\\n  [--to-registry-insecure-skip-tls-verify]\n```\n\nAll images in an image bundle tar file, or Helm charts in a chart bundle, will be pushed to the target OCI registry.\n\n#### Existing tag behaviour\n\nWhen pushing to a registry which could already contain tags that are included in the bundle, the behaviour can be\nspecified via the `--on-existing-tag` flag. The following strategies are available:\n\n- `overwrite`: Overwrite the tag with the contents from the bundle (Default)\n- `error`: Return an error if a matching tag already exists\n- `skip`: Do not push the tag if it already exists\n- `merge-with-retain`: Merge the image index from the bundle with the existing tag, retaining any platforms that already\n  exist in the registry\n- `merge-with-overwrite`: Merge the image index from the bundle with the existing tag, overwriting any platforms that\n  already exist in the registry\n\n### Serving a bundle\n\n```shell\nmindthegap serve bundle --bundle \u003cpath/to/bundle.tar\u003e \\\n  [--listen-address \u003clisten.address\u003e] \\\n  [--listen-port \u003clisten.port\u003e]\n```\n\nStart an OCI registry serving the contents of the image bundle or Helm charts bundle. Note that the OCI registry will\nbe in read-only mode to reflect the source of the data being a static tarball so pushes to this\nregistry will fail.\n\n### Importing an image bundle into containerd\n\n```shell\nmindthegap import image-bundle --image-bundle \u003cpath/to/images.tar\u003e \\\n  [--containerd-namespace \u003ccontainerd.namespace]\n```\n\nImport the images from the image bundle into containerd in the specified namespace. If\n`--containerd-namespace` is not specified, images will be imported into `k8s.io` namespace. This\ncommand requires `ctr` to be in the `PATH`.\n\n## How does it work?\n\n`mindthegap` starts up an [OCI registry](https://docs.docker.com/registry/)\nand then uses [`crane`](https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane.md)\nas a library to copy the specified images for all specified platforms into the running registry. The\nresulting registry storage is then tarred up, resulting in a tarball of the specified images.\n\nThe resulting tarball can be loaded into a running OCI registry, or\nbe used as the initial storage for running your own registry via Docker\nor in a Kubernetes cluster.\n\n## Contributing\n\nThis project uses \u003chttps://www.jetpack.io/devbox/\u003e to create a reproducible build environment. If you do not have\n`devbox` configured, then the following instructions should work for you. For further details, see\n\u003chttps://www.jetpack.io/devbox/docs/installing_devbox/\u003e.\n\n### Integrate with `direnv` for automatic shell integration\n\nInstall direnv: \u003chttps://direnv.net/docs/installation.html#from-system-packages\u003e.\n\nHook direnv into your shell if you haven't already: \u003chttps://direnv.net/docs/hook.html\u003e.\n\n## Building the CLI\n\n`mindthegap` uses [`task`](https://taskfile.dev/) for running build tasks. `task` will be automatically available when\nthe devbox environment is correctly set up.\n\nBuild the CLI using `task build:snapshot` that will output binary into\n`./dist/mindthegap_$(GOOS)_$(GOARCH)/mindthegap`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmesosphere%2Fmindthegap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmesosphere%2Fmindthegap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmesosphere%2Fmindthegap/lists"}