{"id":17929400,"url":"https://github.com/iximiuz/goimagego","last_synced_at":"2025-03-24T04:31:00.857Z","repository":{"id":57514056,"uuid":"239387369","full_name":"iximiuz/goimagego","owner":"iximiuz","description":"goimagego - work with container images in Go (showcase)","archived":false,"fork":false,"pushed_at":"2023-03-29T14:48:05.000Z","size":384,"stargazers_count":24,"open_issues_count":5,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-14T21:46:38.045Z","etag":null,"topics":["containers","docker","golang","images"],"latest_commit_sha":null,"homepage":"https://iximiuz.com/en/posts/working-with-container-images-in-go/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iximiuz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2020-02-09T22:58:17.000Z","updated_at":"2025-02-26T02:17:59.000Z","dependencies_parsed_at":"2024-06-20T08:37:59.181Z","dependency_job_id":"5d69606b-5010-4065-b3f6-1ae986a689ab","html_url":"https://github.com/iximiuz/goimagego","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iximiuz%2Fgoimagego","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iximiuz%2Fgoimagego/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iximiuz%2Fgoimagego/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iximiuz%2Fgoimagego/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iximiuz","download_url":"https://codeload.github.com/iximiuz/goimagego/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244338950,"owners_count":20437166,"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":["containers","docker","golang","images"],"created_at":"2024-10-28T21:09:04.802Z","updated_at":"2025-03-24T04:31:00.551Z","avatar_url":"https://github.com/iximiuz.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# goimagego - work with container images in Go (showcase)\n\nIt's a demo program showing how to pull, store, and mount container images using\n\u003ca href=\"https://github.com/containers/image\"\u003egithub.com/containers/image\u003c/a\u003e and\n\u003ca href=\"https://github.com/containers/storage\"\u003egithub.com/containers/storage\u003c/a\u003e\nlibraries.\n\nThe demo focuses on `overlay` and `vfs` storage drivers on top of `xfs`. In theory, other drivers and file systems supprted by \u003ca href=\"https://github.com/containers/storage\"\u003egithub.com/containers/storage\u003c/a\u003e library should work as well but some extra effort may be needed.\n\n## Installation \u0026 Prerequisites\n\nThe following extra packages are required:\n\n```bash\n# Debian 10\napt-get install pkg-config libgpgme-dev libdevmapper-dev\n\n# CentOS 8 (with enabled EPEL Repository)\nyum install libassuan-devel gpgme-devel device-mapper-devel\n```\n\nAdditionally, `policy.json` file should be created with the mininal content:\n\n```bash\nmkdir /etc/containers\n\ncat \u003c\u003cEOF \u003e /etc/containers/policy.json\n{\n    \"default\": [\n        {\n            \"type\": \"insecureAcceptAnything\"\n        }\n    ],\n    \"transports\": {\n        \"docker\": {}\n    }\n}\nEOF\n```\n\nFrom source code (using `go modules`):\n\n```bash\ngit clone https://github.com/iximiuz/goimagego\ncd goimagego\ngo build -tags \"exclude_graphdriver_btrfs\"\n\n./goimagego help\ngoimagego - work with container images in Go\n\nUsage:\n  goimagego [flags]\n  goimagego [command]\n\nAvailable Commands:\n  container   create container\n  containers  list local containers\n  delete      delete container, image, or layer\n  help        Help about any command\n  images      list local images\n  layers      list local layers\n  mount       mount container\n  pull        pull image from remote repository\n  store       show store info\n  unmount     unmount container\n  wipe        wipe the whole storage\n\nFlags:\n  -d, --driver string     image store driver (overlay, vfs, etc) (default \"overlay\")\n  -h, --help              help for goimagego\n  -r, --root string       image store root directory (default \"/var/lib/containers/storage\")\n  -R, --run-root string   image store run root directory (default \"/var/run/containers/storage\")\n```\n\n## Usage\n\nCurrently, all the examples require `sudo`.\n\n### Show storage info\n\n```bash\n# Using `overlay` storage driver\n$ ./goimagego store\nroot = /var/lib/containers/storage\nrun-root = /var/run/containers/storage\ndriver = overlay\ndriver options = []\nstatus =\n([][2]string) (len=4 cap=4) {\n ([2]string) (len=2 cap=2) {\n  (string) (len=18) \"Backing Filesystem\",\n  (string) (len=3) \"xfs\"\n },\n ([2]string) (len=2 cap=2) {\n  (string) (len=15) \"Supports d_type\",\n  (string) (len=4) \"true\"\n },\n ([2]string) (len=2 cap=2) {\n  (string) (len=19) \"Native Overlay Diff\",\n  (string) (len=4) \"true\"\n },\n ([2]string) (len=2 cap=2) {\n  (string) (len=14) \"Using metacopy\",\n  (string) (len=5) \"false\"\n }\n}\n\n# Using `vfs` storage driver\n$ ./goimagego -d vfs store\nroot = /var/lib/containers/storage\nrun-root = /var/run/containers/storage\ndriver = vfs\ndriver options = []\nstatus =\n([][2]string) \u003cnil\u003e\n\n# Using custom storage location\n./goimagego -d vfs -r /home/vagrant/images store\nroot = /home/vagrant/images\nrun-root = /var/run/containers/storage\ndriver = vfs\ndriver options = []\nstatus =\n([][2]string) \u003cnil\u003e\n```\n\n### Pull image\n\n```bash\n# Using `docker` transport and default registry (docker.io)\n./goimagego pull docker://alpine:latest\nPulling image docker://alpine:latest\nGetting image source signatures\nCopying blob c9b1b535fdd9 done\nCopying config e7d92cdc71 done\nWriting manifest to image destination\nStoring signatures\nImage pulled - {\n   \"schemaVersion\": 2,\n   \"mediaType\": \"application/vnd.docker.distribution.manifest.v2+json\",\n   \"config\": {\n      \"mediaType\": \"application/vnd.docker.container.image.v1+json\",\n      \"size\": 1511,\n      \"digest\": \"sha256:e7d92cdc71feacf90708cb59182d0df1b911f8ae022d29e8e95d75ca6a99776a\"\n   },\n   \"layers\": [\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 2802957,\n         \"digest\": \"sha256:c9b1b535fdd91a9855fb7f82348177e5f019329a58c53c47272962dd60f71fc9\"\n      }\n   ]\n}\n\n# Using `docker` transport and manually specified registry (quay.io):\n./goimagego pull docker://quay.io/prometheus/prometheus\nPulling image docker://quay.io/prometheus/prometheus\nGetting image source signatures\nCopying blob 626a2a3fee8c done\nCopying blob 0f8c40e1270f done\nCopying blob 280e865d0f46 done\nCopying blob 81d2279d1c55 done\nCopying blob 1402c1f8faad done\nCopying blob e7ed030afda4 done\nCopying blob 40c7beb2b8e0 done\nCopying blob c1be047355d9 done\nCopying blob 5e958f95e7b4 done\nCopying blob fb780b8f81a9 done\nCopying blob d81ddb9e06a9 done\nCopying blob 8b293a391a3d done\nCopying config e935122ab1 done\nWriting manifest to image destination\nStoring signatures\nImage pulled - {\n   \"schemaVersion\": 2,\n   \"mediaType\": \"application/vnd.docker.distribution.manifest.v2+json\",\n   \"config\": {\n      \"mediaType\": \"application/vnd.docker.container.image.v1+json\",\n      \"size\": 6669,\n      \"digest\": \"sha256:e935122ab143a64d92ed1fbb27d030cf6e2f0258207be1baf1b509c466aeeb42\"\n   },\n   \"layers\": [\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 761056,\n         \"digest\": \"sha256:0f8c40e1270f10d085dda8ce12b7c5b17cd808f055df5a7222f54837ca0feae0\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 478856,\n         \"digest\": \"sha256:626a2a3fee8c6a9b5b866adc6cb15d54b5d901b6a084a2519bf7f905325b0711\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 33165393,\n         \"digest\": \"sha256:e7ed030afda42ce32fdae9cc4d86002133a3f24fc7561dee73febb04de7a58fe\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 19897006,\n         \"digest\": \"sha256:1402c1f8faadc85692e41acf6bb6f13744295af3eb09a262900f8067c98ee325\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 602,\n         \"digest\": \"sha256:81d2279d1c55bf5372cdd79788cd7760f3186c2843b9d04e8040af6a26b74a32\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 2660,\n         \"digest\": \"sha256:280e865d0f465093732ac66573d6ccf249a56939b8efcd2e8f4b96438e0ad191\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 3059,\n         \"digest\": \"sha256:40c7beb2b8e03e0cc4fd595d545b987ee8f39d680dd69122aa75d3a068c108e6\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 4019,\n         \"digest\": \"sha256:c1be047355d91ba313295e3d1d84d6e129a420c4a8d3aa02f140f41836048d08\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 1271,\n         \"digest\": \"sha256:d81ddb9e06a9f686e66f3ff903e720607b01b0d0072f290ebefb214381e3f7dd\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 114886,\n         \"digest\": \"sha256:fb780b8f81a94ad7937d9d9d2c68255d2cf7b921de821b59aeaec1fd506908de\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 183,\n         \"digest\": \"sha256:5e958f95e7b4a3b6de2f075d095267c54c69dd28da9b700e07a1d40aaee9aed3\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 691,\n         \"digest\": \"sha256:8b293a391a3d1a6544032a5f6bef74fb0cd4e421e319a72886df8a6efcc8aaa1\"\n      }\n   ]\n}\n```\n\n### List local, images, layers, containers\n\n```bash\n$ ./goimagego \u003cimages|layers|contaienrs\u003e\n```\n\n\n### Create, mount, and umount container\n\n```bash\n# Pull image\n$ ./goimagego pull docker://alpine:latest\nPulling image docker://alpine:latest\nGetting image source signatures\nCopying blob c9b1b535fdd9 skipped: already exists\nCopying config e7d92cdc71 done\nWriting manifest to image destination\nStoring signatures\nImage pulled - {\n   \"schemaVersion\": 2,\n   \"mediaType\": \"application/vnd.docker.distribution.manifest.v2+json\",\n   \"config\": {\n      \"mediaType\": \"application/vnd.docker.container.image.v1+json\",\n      \"size\": 1511,\n      \"digest\": \"sha256:e7d92cdc71feacf90708cb59182d0df1b911f8ae022d29e8e95d75ca6a99776a\"\n   },\n   \"layers\": [\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 2802957,\n         \"digest\": \"sha256:c9b1b535fdd91a9855fb7f82348177e5f019329a58c53c47272962dd60f71fc9\"\n      }\n   ]\n}\n\n# Create a new container using the image from above\n$ ./goimagego container e7d92cdc71feacf90708cb59182d0df1b911f8ae022d29e8e95d75ca6a99776a\nContainer:\n(*storage.Container)(0xc000089790)({\n ID: (string) (len=64) \"f7c2136928fbe8e963b594833f0101b964edb5ec299444c2508ce1d3d15ef3c2\",\n Names: ([]string) \u003cnil\u003e,\n ImageID: (string) (len=64) \"e7d92cdc71feacf90708cb59182d0df1b911f8ae022d29e8e95d75ca6a99776a\",\n LayerID: (string) (len=64) \"5d531d0194a79ad4a40232cae1346012739380c0d7c354485d70ddc298ea0d9e\",\n Metadata: (string) \"\",\n BigDataNames: ([]string) \u003cnil\u003e,\n BigDataSizes: (map[string]int64) {\n },\n BigDataDigests: (map[string]digest.Digest) {\n },\n Created: (time.Time) 2020-02-29 17:31:14.129769831 +0000 UTC,\n UIDMap: ([]idtools.IDMap) \u003cnil\u003e,\n GIDMap: ([]idtools.IDMap) \u003cnil\u003e,\n Flags: (map[string]interface {}) (len=2) {\n  (string) (len=12) \"ProcessLabel\": (string) \"\",\n  (string) (len=10) \"MountLabel\": (string) \"\"\n }\n})\n\n# Mount the created container\n$ ./goimagego mount f7c2136928fbe8e963b594833f0101b964edb5ec299444c2508ce1d3d15ef3c2\n/var/lib/containers/storage/overlay/5d531d0194a79ad4a40232cae1346012739380c0d7c354485d70ddc298ea0d9e/merged\n\n$ df /var/lib/containers/storage/overlay/5d531d0194a79ad4a40232cae1346012739380c0d7c354485d70ddc298ea0d9e/merged\nFilesystem     1K-blocks    Used Available Use% Mounted on\noverlay         10474496 5666980   4807516  55% /var/lib/containers/storage/overlay/5d531d0194a79ad4a40232cae1346012739380c0d7c354485d70ddc298ea0d9e/merged\n\n$ ./goimagego unmount f7c2136928fbe8e963b594833f0101b964edb5ec299444c2508ce1d3d15ef3c2\nUnmounted!\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiximiuz%2Fgoimagego","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fiximiuz%2Fgoimagego","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiximiuz%2Fgoimagego/lists"}