{"id":14384182,"url":"https://github.com/mqasimsarfraz/imagesync","last_synced_at":"2025-03-17T11:30:31.656Z","repository":{"id":57519412,"uuid":"190714169","full_name":"mqasimsarfraz/imagesync","owner":"mqasimsarfraz","description":"A tool to copy/sync docker images between registries without docker deamon","archived":false,"fork":false,"pushed_at":"2025-02-24T22:56:00.000Z","size":18513,"stargazers_count":51,"open_issues_count":2,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-27T23:02:01.676Z","etag":null,"topics":["docker","docker-image","docker-registry","golang","sync"],"latest_commit_sha":null,"homepage":"https://hub.docker.com/r/smqasims/imagesync/tags","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/mqasimsarfraz.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":"2019-06-07T08:50:41.000Z","updated_at":"2025-02-27T11:37:13.000Z","dependencies_parsed_at":"2024-10-23T06:57:32.402Z","dependency_job_id":null,"html_url":"https://github.com/mqasimsarfraz/imagesync","commit_stats":null,"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mqasimsarfraz%2Fimagesync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mqasimsarfraz%2Fimagesync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mqasimsarfraz%2Fimagesync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mqasimsarfraz%2Fimagesync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mqasimsarfraz","download_url":"https://codeload.github.com/mqasimsarfraz/imagesync/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243858056,"owners_count":20359271,"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":["docker","docker-image","docker-registry","golang","sync"],"created_at":"2024-08-28T18:01:11.294Z","updated_at":"2025-03-17T11:30:26.641Z","avatar_url":"https://github.com/mqasimsarfraz.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"\u003cp\u003e\n    \u003ca href=\"https://github.com/mqasimsarfraz/imagesync/actions/workflows/imagesync-ci.yaml\"\u003e\n        \u003cimg src=\"https://github.com/mqasimsarfraz/imagesync/actions/workflows/imagesync-ci.yaml/badge.svg\" alt=\"CI\"/\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/mqasimsarfraz/imagesync/actions/workflows/codeql-analysis.yml\"\u003e\n        \u003cimg src=\"https://github.com/mqasimsarfraz/imagesync/actions/workflows/codeql-analysis.yml/badge.svg\" alt=\"codeql\"/\u003e\u003c/a\u003e\n    \u003ca href=\"https://mqasimsarfraz.github.io/\"\u003e\n        \u003cimg src=\"https://img.shields.io/maintenance/yes/2024.svg\" alt=\"maintained\"/\u003e\u003c/a\u003e\n    \u003ca href=\"https://hub.docker.com/r/smqasims/imagesync\"\u003e\n        \u003cimg src=\"https://img.shields.io/docker/pulls/smqasims/imagesync.svg\" alt=\"pulls\"/\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n# imagesync\n\nA tool to copy/sync images in registries without a demon.\n\n```bash\nimagesync -h\n\nNAME:\n   imagesync - Sync images in registries.\n\nUSAGE:\n   imagesync [global options] command [command options] [arguments...]\n\nCOMMANDS:\n   help, h  Shows a list of commands or help for one command\n\nGLOBAL OPTIONS:\n   --src value, -s value        Reference for the source container image/repository.\n   --src-strict-tls             Enable strict TLS for connections to source container registry.\n   --dest value, -d value       Reference for the destination container repository.\n   --dest-strict-tls            Enable strict TLS for connections to destination container registry.\n   --tags-pattern value         Regex pattern to select for tag to-be synced.\n   --skip-tags-pattern value    Regex pattern to exclude tags.\n   --skip-tags value            Comma separated list of tags to be skipped.\n   --overwrite                  Use this to copy/override all the tags.\n   --max-concurrent-tags value  Maximum number of tags to be synced/copied in parallel. (default: 1)\n   --help, -h                   show help\n```\n\n## Installation\n\n### Binary\n\nYou can download the binary from [releases](https://github.com/mqasimsarfraz/imagesync/releases) page and use it directly:\n\n```bash\nVERSION=$(curl -s https://api.github.com/repos/mqasimsarfraz/imagesync/releases/latest | jq -r .tag_name)\ncurl -sL https://github.com/mqasimsarfraz/imagesync/releases/download/${VERSION}/imagesync_Linux_x86_64.tar.gz | sudo tar -C /usr/local/bin -xzf - imagesync\nimagesync -h\n```\n\n### Docker\n\nYou can use the docker image to run `imagesync`:\n\n```bash\nVERSION=$(curl -s https://api.github.com/repos/mqasimsarfraz/imagesync/releases/latest | jq -r .tag_name)\ndocker run --rm -it  ghcr.io/mqasimsarfraz/imagesync:$VERSION -h\n```\n\n## Examples\nFollowing is a list of examples with different sources. In order to try out examples with [testdata](testdata) you need to start a local [registry](https://docs.docker.com/registry/deploying/#run-a-local-registry) using:\n\n```\ndocker run -d -p 5000:5000 --restart=always --name registry registry:2\n```\n\n### Docker Archive\n\n```\nimagesync  -s testdata/alpine.tar -d localhost:5000/library/alpine:3\n```\n\n### OCI Archive\n\n```\nimagesync  -s testdata/alpine-oci.tar -d localhost:5000/library/alpine:3\n```\n\n### OCI layout\n\n```\nimagesync  -s testdata/alpine-oci -d localhost:5000/library/alpine:3\n```\n\n### Image Tag\n\n#### container image\n```\nimagesync  -s library/alpine:3 -d localhost:5000/library/alpine:3\n```\n\n#### helm chart\n```\nimagesync  -s ghcr.io/nginxinc/charts/nginx-ingress:1.3.1 -d localhost:5000/nginxinc/charts/nginx-ingress:1.3.1\n```\n\n### Entire Repository\n\n```\nimagesync  -s library/alpine -d localhost:5000/library/alpine\n```\n\n### Entire Repository (helm)\n\n```\nimagesync -s ghcr.io/nginxinc/charts/nginx-ingress -d localhost:5000/nginxinc/charts/nginx-ingress\n```\n\n## Private Registries\n\n`imagesync` will respect the credentials stored in `~/.docker/config.json` via `docker login` etc. So in case you are\nrunning it in a container you need to mount the path with credentials as:\n\n```\ndocker run --rm -it  -v ${HOME}/.docker/config.json:/root/.docker/config.json  ghcr.io/mqasimsarfraz/imagesync:v1.2.0 -h\n```\n\n## Multi-arch images\n\n`imagesync` supports copying multi-arch images. So in case you are copying a multi-arch image it will copy all the platforms unlike `docker pull`/`docker push` approach which only copies the platform of the host.\n\n## Contributing/Dependencies\n\nFollowing needs to be installed in order to compile the project locally:\n\n### fedora/centos\n\n```\ndnf --enablerepo=powertools install gpgme-devel\ndnf install libassuan  libassuan-devel\n```\n\n### debian/ubuntu\n\n```\nsudo apt install libgpgme-dev libassuan-dev libbtrfs-dev libdevmapper-dev pkg-config\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmqasimsarfraz%2Fimagesync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmqasimsarfraz%2Fimagesync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmqasimsarfraz%2Fimagesync/lists"}