Repository files navigation

CircleCI

registry-cli

registry.py is a script for easy manipulation of docker-registry from command line (and from scripts)

Table of Contents

Installation

Docker image

You can download ready-made docker image with the script and all python dependencies pre-installed:

 docker pull anoxis/registry-cli

In this case, replace registry.py with docker run --rm anoxis/registry-cli in all commands below, e.g.

 docker run --rm anoxis/registry-cli -r http://example.com:5000

Note: when you use the docker image and registry on the same computer (registry is on localhost), then due to internal network created by docker you have to link to the registry's network and refer registry container by its name, not localhost. E.g. your registry container is named "registry", then the command to launch registry-cli would be

 docker run --rm --link registry anoxis/registry-cli -r http://registry:5000

python script

Download registry.py and set it as executable

 chmod 755 registry.py

Install dependencies:

 sudo pip install -r requirements-build.txt

Listing images

The below command will list all images and all tags in your registry:

 registry.py -l user:pass -r https://example.com:5000

List all images, tags and layers:

 registry.py -l user:pass -r https://example.com:5000 --layers

List particular image(s) or image:tag (all tags of ubuntu and alpine in this example)

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu alpine

Same as above but with layers

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu alpine --layers

Username and password

It is optional, you can omit it in case if you use insecure registry without authentication (up to you, but its really insecure; make sure you protect your entire registry from anyone)

username and password pair can be provided in the following forms

 -l username:password
-l 'username':'password'
-l "username":"password"

Username cannot contain colon (':') (I don't think it will contain ever, but anyway I warned you). Password, in its turn, can contain as many colons as you wish.

Deleting images

Keep only last 10 versions (useful for CI): Delete all tags of all images but keep last 10 tags (you can put this command to your build script after building images)

 registry.py -l user:pass -r https://example.com:5000 --delete

If number of tags is less than 10 it will not delete any

You can change the number of tags to keep, e.g. 5:

 registry.py -l user:pass -r https://example.com:5000 --delete --num 5

You may also specify tags to be deleted using a list of regexp based names. The following command would delete all tags containing "snapshot-" and beginning with "stable-" and a 4 digit number:

 registry.py -l user:pass -r https://example.com:5000 --delete --tags-like "snapshot-" "^stable-[0-9]{4}.*"

As one manifest may be referenced by more than one tag, you may add tags, whose manifests should NOT be deleted. A tag that would otherwise be deleted, but whose manifest references one of those "kept" tags, is spared for deletion. In the following case, all tags beginning with "snapshot-" will be deleted, save those whose manifest point to "stable" or "latest":

 registry.py -l user:pass -r https://example.com:5000 --delete --tags-like "snapshot-" --keep-tags "stable" "latest"

The last parameter is also available as regexp option with --keep-tags-like.

Delete all tags for particular image (e.g. delete all ubuntu tags):

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu --delete-all

Delete all tags for all images (do you really want to do it?):

 registry.py -l user:pass -r https://example.com:5000 --delete-all --dry-run

Delete all tags by age in hours for the particular image (e.g. older than 24 hours, with --keep-tags and --keep-tags-like options, --dry-run for safe).

 registry.py -r https://example.com:5000 -i api-docs-origin/master --dry-run --delete-by-hours 24 --keep-tags c59c02c25f023263fd4b5d43fc1ff653f08b3d4x --keep-tags-like late

Note that deleting by age will not prevent more recent tags from being deleted if there are more than 10 (or specified --num value). In order to keep all tags within a designated period, use the --keep-by-hours flag:

 registry.py -r https://example.com:5000 --dry-run --delete --keep-by-hours 72 --keep-tags-like latest

Disable ssl verification

If you are using docker registry with a self signed ssl certificate, you can disable ssl verification:

 registry.py -l user:pass -r https://example.com:5000 --no-validate-ssl

Nexus docker registry

Add --digest-method flag

registry.py -l user:pass -r https://example.com:5000 --digest-method GET

Important notes:

garbage-collection in docker-registry

  1. docker registry API does not actually delete tags or images, it marks them for later garbage collection. So, make sure you run something like below (or put them in your crontab):
 cd [path-where-your-docker-compose.yml]
docker-compose stop registry
docker-compose run --rm \
registry bin/registry garbage-collect \
/etc/docker/registry/config.yml
docker-compose up -d registry

or (if you are not using docker-compose):

 docker stop registry:2
docker run --rm registry:2 bin/registry garbage-collect \
/etc/docker/registry/config.yml
docker start registry:2

for more detail on garbage collection read here: https://docs.docker.com/registry/garbage-collection/

enable image deletion in docker-registry

Make sure to enable it by either creating environment variable REGISTRY_STORAGE_DELETE_ENABLED: "true" or adding relevant configuration option to the docker-registry's config.yml. For more on docker-registry configuration, read here: https://docs.docker.com/registry/configuration/

You may get Error 405 message from script (Functionality not supported) when this option is not enabled.

Contribution

You are very welcome to contribute to this script. Of course, when making changes, please include your changes into test.py and run tests to check that your changes do not break existing functionality.

For tests to work, more libraries are needed

 pip install -r requirements-ci.txt

Running tests is as simple as

 python test.py

Test will print few error messages, like so

Testing started at 9:31 AM ...
tag digest not found: 400
error 400

this is ok, because test simulates invalid inputs also.

Contact

Please feel free to contact me at anoxis@gmail.com if you wish to add more functionality or want to contribute.

About

Scripts for easy manipulation of docker-registry from command line (and from scripts)

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

CircleCI

registry-cli

registry.py is a script for easy manipulation of docker-registry from command line (and from scripts)

Table of Contents

Installation

Docker image

You can download ready-made docker image with the script and all python dependencies pre-installed:

 docker pull anoxis/registry-cli

In this case, replace registry.py with docker run --rm anoxis/registry-cli in all commands below, e.g.

 docker run --rm anoxis/registry-cli -r http://example.com:5000

Note: when you use the docker image and registry on the same computer (registry is on localhost), then due to internal network created by docker you have to link to the registry's network and refer registry container by its name, not localhost. E.g. your registry container is named "registry", then the command to launch registry-cli would be

 docker run --rm --link registry anoxis/registry-cli -r http://registry:5000

python script

Download registry.py and set it as executable

 chmod 755 registry.py

Install dependencies:

 sudo pip install -r requirements-build.txt

Listing images

The below command will list all images and all tags in your registry:

 registry.py -l user:pass -r https://example.com:5000

List all images, tags and layers:

 registry.py -l user:pass -r https://example.com:5000 --layers

List particular image(s) or image:tag (all tags of ubuntu and alpine in this example)

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu alpine

Same as above but with layers

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu alpine --layers

Username and password

It is optional, you can omit it in case if you use insecure registry without authentication (up to you, but its really insecure; make sure you protect your entire registry from anyone)

username and password pair can be provided in the following forms

 -l username:password
-l 'username':'password'
-l "username":"password"

Username cannot contain colon (':') (I don't think it will contain ever, but anyway I warned you). Password, in its turn, can contain as many colons as you wish.

Deleting images

Keep only last 10 versions (useful for CI): Delete all tags of all images but keep last 10 tags (you can put this command to your build script after building images)

 registry.py -l user:pass -r https://example.com:5000 --delete

If number of tags is less than 10 it will not delete any

You can change the number of tags to keep, e.g. 5:

 registry.py -l user:pass -r https://example.com:5000 --delete --num 5

You may also specify tags to be deleted using a list of regexp based names. The following command would delete all tags containing "snapshot-" and beginning with "stable-" and a 4 digit number:

 registry.py -l user:pass -r https://example.com:5000 --delete --tags-like "snapshot-" "^stable-[0-9]{4}.*"

As one manifest may be referenced by more than one tag, you may add tags, whose manifests should NOT be deleted. A tag that would otherwise be deleted, but whose manifest references one of those "kept" tags, is spared for deletion. In the following case, all tags beginning with "snapshot-" will be deleted, save those whose manifest point to "stable" or "latest":

 registry.py -l user:pass -r https://example.com:5000 --delete --tags-like "snapshot-" --keep-tags "stable" "latest"

The last parameter is also available as regexp option with --keep-tags-like.

Delete all tags for particular image (e.g. delete all ubuntu tags):

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu --delete-all

Delete all tags for all images (do you really want to do it?):

 registry.py -l user:pass -r https://example.com:5000 --delete-all --dry-run

Delete all tags by age in hours for the particular image (e.g. older than 24 hours, with --keep-tags and --keep-tags-like options, --dry-run for safe).

 registry.py -r https://example.com:5000 -i api-docs-origin/master --dry-run --delete-by-hours 24 --keep-tags c59c02c25f023263fd4b5d43fc1ff653f08b3d4x --keep-tags-like late

Note that deleting by age will not prevent more recent tags from being deleted if there are more than 10 (or specified --num value). In order to keep all tags within a designated period, use the --keep-by-hours flag:

 registry.py -r https://example.com:5000 --dry-run --delete --keep-by-hours 72 --keep-tags-like latest

Disable ssl verification

If you are using docker registry with a self signed ssl certificate, you can disable ssl verification:

 registry.py -l user:pass -r https://example.com:5000 --no-validate-ssl

Nexus docker registry

Add --digest-method flag

registry.py -l user:pass -r https://example.com:5000 --digest-method GET

Important notes:

garbage-collection in docker-registry

  1. docker registry API does not actually delete tags or images, it marks them for later garbage collection. So, make sure you run something like below (or put them in your crontab):
 cd [path-where-your-docker-compose.yml]
docker-compose stop registry
docker-compose run --rm \
registry bin/registry garbage-collect \
/etc/docker/registry/config.yml
docker-compose up -d registry

or (if you are not using docker-compose):

 docker stop registry:2
docker run --rm registry:2 bin/registry garbage-collect \
/etc/docker/registry/config.yml
docker start registry:2

for more detail on garbage collection read here: https://docs.docker.com/registry/garbage-collection/

enable image deletion in docker-registry

Make sure to enable it by either creating environment variable REGISTRY_STORAGE_DELETE_ENABLED: "true" or adding relevant configuration option to the docker-registry's config.yml. For more on docker-registry configuration, read here: https://docs.docker.com/registry/configuration/

You may get Error 405 message from script (Functionality not supported) when this option is not enabled.

Contribution

You are very welcome to contribute to this script. Of course, when making changes, please include your changes into test.py and run tests to check that your changes do not break existing functionality.

For tests to work, more libraries are needed

 pip install -r requirements-ci.txt

Running tests is as simple as

 python test.py

Test will print few error messages, like so

Testing started at 9:31 AM ...
tag digest not found: 400
error 400

this is ok, because test simulates invalid inputs also.

Contact

Please feel free to contact me at anoxis@gmail.com if you wish to add more functionality or want to contribute.

About

Scripts for easy manipulation of docker-registry from command line (and from scripts)

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CircleCI

registry-cli

registry.py is a script for easy manipulation of docker-registry from command line (and from scripts)

Table of Contents

Installation

Docker image

You can download ready-made docker image with the script and all python dependencies pre-installed:

 docker pull anoxis/registry-cli

In this case, replace registry.py with docker run --rm anoxis/registry-cli in all commands below, e.g.

 docker run --rm anoxis/registry-cli -r http://example.com:5000

Note: when you use the docker image and registry on the same computer (registry is on localhost), then due to internal network created by docker you have to link to the registry's network and refer registry container by its name, not localhost. E.g. your registry container is named "registry", then the command to launch registry-cli would be

 docker run --rm --link registry anoxis/registry-cli -r http://registry:5000

python script

Download registry.py and set it as executable

 chmod 755 registry.py

Install dependencies:

 sudo pip install -r requirements-build.txt

Listing images

The below command will list all images and all tags in your registry:

 registry.py -l user:pass -r https://example.com:5000

List all images, tags and layers:

 registry.py -l user:pass -r https://example.com:5000 --layers

List particular image(s) or image:tag (all tags of ubuntu and alpine in this example)

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu alpine

Same as above but with layers

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu alpine --layers

Username and password

It is optional, you can omit it in case if you use insecure registry without authentication (up to you, but its really insecure; make sure you protect your entire registry from anyone)

username and password pair can be provided in the following forms

 -l username:password
-l 'username':'password'
-l "username":"password"

Username cannot contain colon (':') (I don't think it will contain ever, but anyway I warned you). Password, in its turn, can contain as many colons as you wish.

Deleting images

Keep only last 10 versions (useful for CI): Delete all tags of all images but keep last 10 tags (you can put this command to your build script after building images)

 registry.py -l user:pass -r https://example.com:5000 --delete

If number of tags is less than 10 it will not delete any

You can change the number of tags to keep, e.g. 5:

 registry.py -l user:pass -r https://example.com:5000 --delete --num 5

You may also specify tags to be deleted using a list of regexp based names. The following command would delete all tags containing "snapshot-" and beginning with "stable-" and a 4 digit number:

 registry.py -l user:pass -r https://example.com:5000 --delete --tags-like "snapshot-" "^stable-[0-9]{4}.*"

As one manifest may be referenced by more than one tag, you may add tags, whose manifests should NOT be deleted. A tag that would otherwise be deleted, but whose manifest references one of those "kept" tags, is spared for deletion. In the following case, all tags beginning with "snapshot-" will be deleted, save those whose manifest point to "stable" or "latest":

 registry.py -l user:pass -r https://example.com:5000 --delete --tags-like "snapshot-" --keep-tags "stable" "latest"

The last parameter is also available as regexp option with --keep-tags-like.

Delete all tags for particular image (e.g. delete all ubuntu tags):

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu --delete-all

Delete all tags for all images (do you really want to do it?):

 registry.py -l user:pass -r https://example.com:5000 --delete-all --dry-run

Delete all tags by age in hours for the particular image (e.g. older than 24 hours, with --keep-tags and --keep-tags-like options, --dry-run for safe).

 registry.py -r https://example.com:5000 -i api-docs-origin/master --dry-run --delete-by-hours 24 --keep-tags c59c02c25f023263fd4b5d43fc1ff653f08b3d4x --keep-tags-like late

Note that deleting by age will not prevent more recent tags from being deleted if there are more than 10 (or specified --num value). In order to keep all tags within a designated period, use the --keep-by-hours flag:

 registry.py -r https://example.com:5000 --dry-run --delete --keep-by-hours 72 --keep-tags-like latest

Disable ssl verification

If you are using docker registry with a self signed ssl certificate, you can disable ssl verification:

 registry.py -l user:pass -r https://example.com:5000 --no-validate-ssl

Nexus docker registry

Add --digest-method flag

registry.py -l user:pass -r https://example.com:5000 --digest-method GET

Important notes:

garbage-collection in docker-registry

  1. docker registry API does not actually delete tags or images, it marks them for later garbage collection. So, make sure you run something like below (or put them in your crontab):
 cd [path-where-your-docker-compose.yml]
docker-compose stop registry
docker-compose run --rm \
registry bin/registry garbage-collect \
/etc/docker/registry/config.yml
docker-compose up -d registry

or (if you are not using docker-compose):

 docker stop registry:2
docker run --rm registry:2 bin/registry garbage-collect \
/etc/docker/registry/config.yml
docker start registry:2

for more detail on garbage collection read here: https://docs.docker.com/registry/garbage-collection/

enable image deletion in docker-registry

Make sure to enable it by either creating environment variable REGISTRY_STORAGE_DELETE_ENABLED: "true" or adding relevant configuration option to the docker-registry's config.yml. For more on docker-registry configuration, read here: https://docs.docker.com/registry/configuration/

You may get Error 405 message from script (Functionality not supported) when this option is not enabled.

Contribution

You are very welcome to contribute to this script. Of course, when making changes, please include your changes into test.py and run tests to check that your changes do not break existing functionality.

For tests to work, more libraries are needed

 pip install -r requirements-ci.txt

Running tests is as simple as

 python test.py

Test will print few error messages, like so

Testing started at 9:31 AM ...
tag digest not found: 400
error 400

this is ok, because test simulates invalid inputs also.

Contact

Please feel free to contact me at anoxis@gmail.com if you wish to add more functionality or want to contribute.

About

Scripts for easy manipulation of docker-registry from command line (and from scripts)

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CircleCI

registry-cli

registry.py is a script for easy manipulation of docker-registry from command line (and from scripts)

Table of Contents

Installation

Docker image

You can download ready-made docker image with the script and all python dependencies pre-installed:

 docker pull anoxis/registry-cli

In this case, replace registry.py with docker run --rm anoxis/registry-cli in all commands below, e.g.

 docker run --rm anoxis/registry-cli -r http://example.com:5000

Note: when you use the docker image and registry on the same computer (registry is on localhost), then due to internal network created by docker you have to link to the registry's network and refer registry container by its name, not localhost. E.g. your registry container is named "registry", then the command to launch registry-cli would be

 docker run --rm --link registry anoxis/registry-cli -r http://registry:5000

python script

Download registry.py and set it as executable

 chmod 755 registry.py

Install dependencies:

 sudo pip install -r requirements-build.txt

Listing images

The below command will list all images and all tags in your registry:

 registry.py -l user:pass -r https://example.com:5000

List all images, tags and layers:

 registry.py -l user:pass -r https://example.com:5000 --layers

List particular image(s) or image:tag (all tags of ubuntu and alpine in this example)

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu alpine

Same as above but with layers

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu alpine --layers

Username and password

It is optional, you can omit it in case if you use insecure registry without authentication (up to you, but its really insecure; make sure you protect your entire registry from anyone)

username and password pair can be provided in the following forms

 -l username:password
-l 'username':'password'
-l "username":"password"

Username cannot contain colon (':') (I don't think it will contain ever, but anyway I warned you). Password, in its turn, can contain as many colons as you wish.

Deleting images

Keep only last 10 versions (useful for CI): Delete all tags of all images but keep last 10 tags (you can put this command to your build script after building images)

 registry.py -l user:pass -r https://example.com:5000 --delete

If number of tags is less than 10 it will not delete any

You can change the number of tags to keep, e.g. 5:

 registry.py -l user:pass -r https://example.com:5000 --delete --num 5

You may also specify tags to be deleted using a list of regexp based names. The following command would delete all tags containing "snapshot-" and beginning with "stable-" and a 4 digit number:

 registry.py -l user:pass -r https://example.com:5000 --delete --tags-like "snapshot-" "^stable-[0-9]{4}.*"

As one manifest may be referenced by more than one tag, you may add tags, whose manifests should NOT be deleted. A tag that would otherwise be deleted, but whose manifest references one of those "kept" tags, is spared for deletion. In the following case, all tags beginning with "snapshot-" will be deleted, save those whose manifest point to "stable" or "latest":

 registry.py -l user:pass -r https://example.com:5000 --delete --tags-like "snapshot-" --keep-tags "stable" "latest"

The last parameter is also available as regexp option with --keep-tags-like.

Delete all tags for particular image (e.g. delete all ubuntu tags):

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu --delete-all

Delete all tags for all images (do you really want to do it?):

 registry.py -l user:pass -r https://example.com:5000 --delete-all --dry-run

Delete all tags by age in hours for the particular image (e.g. older than 24 hours, with --keep-tags and --keep-tags-like options, --dry-run for safe).

 registry.py -r https://example.com:5000 -i api-docs-origin/master --dry-run --delete-by-hours 24 --keep-tags c59c02c25f023263fd4b5d43fc1ff653f08b3d4x --keep-tags-like late

Note that deleting by age will not prevent more recent tags from being deleted if there are more than 10 (or specified --num value). In order to keep all tags within a designated period, use the --keep-by-hours flag:

 registry.py -r https://example.com:5000 --dry-run --delete --keep-by-hours 72 --keep-tags-like latest

Disable ssl verification

If you are using docker registry with a self signed ssl certificate, you can disable ssl verification:

 registry.py -l user:pass -r https://example.com:5000 --no-validate-ssl

Nexus docker registry

Add --digest-method flag

registry.py -l user:pass -r https://example.com:5000 --digest-method GET

Important notes:

garbage-collection in docker-registry

  1. docker registry API does not actually delete tags or images, it marks them for later garbage collection. So, make sure you run something like below (or put them in your crontab):
 cd [path-where-your-docker-compose.yml]
docker-compose stop registry
docker-compose run --rm \
registry bin/registry garbage-collect \
/etc/docker/registry/config.yml
docker-compose up -d registry

or (if you are not using docker-compose):

 docker stop registry:2
docker run --rm registry:2 bin/registry garbage-collect \
/etc/docker/registry/config.yml
docker start registry:2

for more detail on garbage collection read here: https://docs.docker.com/registry/garbage-collection/

enable image deletion in docker-registry

Make sure to enable it by either creating environment variable REGISTRY_STORAGE_DELETE_ENABLED: "true" or adding relevant configuration option to the docker-registry's config.yml. For more on docker-registry configuration, read here: https://docs.docker.com/registry/configuration/

You may get Error 405 message from script (Functionality not supported) when this option is not enabled.

Contribution

You are very welcome to contribute to this script. Of course, when making changes, please include your changes into test.py and run tests to check that your changes do not break existing functionality.

For tests to work, more libraries are needed

 pip install -r requirements-ci.txt

Running tests is as simple as

 python test.py

Test will print few error messages, like so

Testing started at 9:31 AM ...
tag digest not found: 400
error 400

this is ok, because test simulates invalid inputs also.

Contact

Please feel free to contact me at anoxis@gmail.com if you wish to add more functionality or want to contribute.

About

Scripts for easy manipulation of docker-registry from command line (and from scripts)

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

CircleCI

registry-cli

registry.py is a script for easy manipulation of docker-registry from command line (and from scripts)

Table of Contents

Installation

Docker image

You can download ready-made docker image with the script and all python dependencies pre-installed:

 docker pull anoxis/registry-cli

In this case, replace registry.py with docker run --rm anoxis/registry-cli in all commands below, e.g.

 docker run --rm anoxis/registry-cli -r http://example.com:5000

Note: when you use the docker image and registry on the same computer (registry is on localhost), then due to internal network created by docker you have to link to the registry's network and refer registry container by its name, not localhost. E.g. your registry container is named "registry", then the command to launch registry-cli would be

 docker run --rm --link registry anoxis/registry-cli -r http://registry:5000

python script

Download registry.py and set it as executable

 chmod 755 registry.py

Install dependencies:

 sudo pip install -r requirements-build.txt

Listing images

The below command will list all images and all tags in your registry:

 registry.py -l user:pass -r https://example.com:5000

List all images, tags and layers:

 registry.py -l user:pass -r https://example.com:5000 --layers

List particular image(s) or image:tag (all tags of ubuntu and alpine in this example)

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu alpine

Same as above but with layers

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu alpine --layers

Username and password

It is optional, you can omit it in case if you use insecure registry without authentication (up to you, but its really insecure; make sure you protect your entire registry from anyone)

username and password pair can be provided in the following forms

 -l username:password
-l 'username':'password'
-l "username":"password"

Username cannot contain colon (':') (I don't think it will contain ever, but anyway I warned you). Password, in its turn, can contain as many colons as you wish.

Deleting images

Keep only last 10 versions (useful for CI): Delete all tags of all images but keep last 10 tags (you can put this command to your build script after building images)

 registry.py -l user:pass -r https://example.com:5000 --delete

If number of tags is less than 10 it will not delete any

You can change the number of tags to keep, e.g. 5:

 registry.py -l user:pass -r https://example.com:5000 --delete --num 5

You may also specify tags to be deleted using a list of regexp based names. The following command would delete all tags containing "snapshot-" and beginning with "stable-" and a 4 digit number:

 registry.py -l user:pass -r https://example.com:5000 --delete --tags-like "snapshot-" "^stable-[0-9]{4}.*"

As one manifest may be referenced by more than one tag, you may add tags, whose manifests should NOT be deleted. A tag that would otherwise be deleted, but whose manifest references one of those "kept" tags, is spared for deletion. In the following case, all tags beginning with "snapshot-" will be deleted, save those whose manifest point to "stable" or "latest":

 registry.py -l user:pass -r https://example.com:5000 --delete --tags-like "snapshot-" --keep-tags "stable" "latest"

The last parameter is also available as regexp option with --keep-tags-like.

Delete all tags for particular image (e.g. delete all ubuntu tags):

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu --delete-all

Delete all tags for all images (do you really want to do it?):

 registry.py -l user:pass -r https://example.com:5000 --delete-all --dry-run

Delete all tags by age in hours for the particular image (e.g. older than 24 hours, with --keep-tags and --keep-tags-like options, --dry-run for safe).

 registry.py -r https://example.com:5000 -i api-docs-origin/master --dry-run --delete-by-hours 24 --keep-tags c59c02c25f023263fd4b5d43fc1ff653f08b3d4x --keep-tags-like late

Note that deleting by age will not prevent more recent tags from being deleted if there are more than 10 (or specified --num value). In order to keep all tags within a designated period, use the --keep-by-hours flag:

 registry.py -r https://example.com:5000 --dry-run --delete --keep-by-hours 72 --keep-tags-like latest

Disable ssl verification

If you are using docker registry with a self signed ssl certificate, you can disable ssl verification:

 registry.py -l user:pass -r https://example.com:5000 --no-validate-ssl

Nexus docker registry

Add --digest-method flag

registry.py -l user:pass -r https://example.com:5000 --digest-method GET

Important notes:

garbage-collection in docker-registry

  1. docker registry API does not actually delete tags or images, it marks them for later garbage collection. So, make sure you run something like below (or put them in your crontab):
 cd [path-where-your-docker-compose.yml]
docker-compose stop registry
docker-compose run --rm \
registry bin/registry garbage-collect \
/etc/docker/registry/config.yml
docker-compose up -d registry

or (if you are not using docker-compose):

 docker stop registry:2
docker run --rm registry:2 bin/registry garbage-collect \
/etc/docker/registry/config.yml
docker start registry:2

for more detail on garbage collection read here: https://docs.docker.com/registry/garbage-collection/

enable image deletion in docker-registry

Make sure to enable it by either creating environment variable REGISTRY_STORAGE_DELETE_ENABLED: "true" or adding relevant configuration option to the docker-registry's config.yml. For more on docker-registry configuration, read here: https://docs.docker.com/registry/configuration/

You may get Error 405 message from script (Functionality not supported) when this option is not enabled.

Contribution

You are very welcome to contribute to this script. Of course, when making changes, please include your changes into test.py and run tests to check that your changes do not break existing functionality.

For tests to work, more libraries are needed

 pip install -r requirements-ci.txt

Running tests is as simple as

 python test.py

Test will print few error messages, like so

Testing started at 9:31 AM ...
tag digest not found: 400
error 400

this is ok, because test simulates invalid inputs also.

Contact

Please feel free to contact me at anoxis@gmail.com if you wish to add more functionality or want to contribute.

About

Scripts for easy manipulation of docker-registry from command line (and from scripts)

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CircleCI

registry-cli

registry.py is a script for easy manipulation of docker-registry from command line (and from scripts)

Table of Contents

Installation

Docker image

You can download ready-made docker image with the script and all python dependencies pre-installed:

 docker pull anoxis/registry-cli

In this case, replace registry.py with docker run --rm anoxis/registry-cli in all commands below, e.g.

 docker run --rm anoxis/registry-cli -r http://example.com:5000

Note: when you use the docker image and registry on the same computer (registry is on localhost), then due to internal network created by docker you have to link to the registry's network and refer registry container by its name, not localhost. E.g. your registry container is named "registry", then the command to launch registry-cli would be

 docker run --rm --link registry anoxis/registry-cli -r http://registry:5000

python script

Download registry.py and set it as executable

 chmod 755 registry.py

Install dependencies:

 sudo pip install -r requirements-build.txt

Listing images

The below command will list all images and all tags in your registry:

 registry.py -l user:pass -r https://example.com:5000

List all images, tags and layers:

 registry.py -l user:pass -r https://example.com:5000 --layers

List particular image(s) or image:tag (all tags of ubuntu and alpine in this example)

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu alpine

Same as above but with layers

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu alpine --layers

Username and password

It is optional, you can omit it in case if you use insecure registry without authentication (up to you, but its really insecure; make sure you protect your entire registry from anyone)

username and password pair can be provided in the following forms

 -l username:password
-l 'username':'password'
-l "username":"password"

Username cannot contain colon (':') (I don't think it will contain ever, but anyway I warned you). Password, in its turn, can contain as many colons as you wish.

Deleting images

Keep only last 10 versions (useful for CI): Delete all tags of all images but keep last 10 tags (you can put this command to your build script after building images)

 registry.py -l user:pass -r https://example.com:5000 --delete

If number of tags is less than 10 it will not delete any

You can change the number of tags to keep, e.g. 5:

 registry.py -l user:pass -r https://example.com:5000 --delete --num 5

You may also specify tags to be deleted using a list of regexp based names. The following command would delete all tags containing "snapshot-" and beginning with "stable-" and a 4 digit number:

 registry.py -l user:pass -r https://example.com:5000 --delete --tags-like "snapshot-" "^stable-[0-9]{4}.*"

As one manifest may be referenced by more than one tag, you may add tags, whose manifests should NOT be deleted. A tag that would otherwise be deleted, but whose manifest references one of those "kept" tags, is spared for deletion. In the following case, all tags beginning with "snapshot-" will be deleted, save those whose manifest point to "stable" or "latest":

 registry.py -l user:pass -r https://example.com:5000 --delete --tags-like "snapshot-" --keep-tags "stable" "latest"

The last parameter is also available as regexp option with --keep-tags-like.

Delete all tags for particular image (e.g. delete all ubuntu tags):

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu --delete-all

Delete all tags for all images (do you really want to do it?):

 registry.py -l user:pass -r https://example.com:5000 --delete-all --dry-run

Delete all tags by age in hours for the particular image (e.g. older than 24 hours, with --keep-tags and --keep-tags-like options, --dry-run for safe).

 registry.py -r https://example.com:5000 -i api-docs-origin/master --dry-run --delete-by-hours 24 --keep-tags c59c02c25f023263fd4b5d43fc1ff653f08b3d4x --keep-tags-like late

Note that deleting by age will not prevent more recent tags from being deleted if there are more than 10 (or specified --num value). In order to keep all tags within a designated period, use the --keep-by-hours flag:

 registry.py -r https://example.com:5000 --dry-run --delete --keep-by-hours 72 --keep-tags-like latest

Disable ssl verification

If you are using docker registry with a self signed ssl certificate, you can disable ssl verification:

 registry.py -l user:pass -r https://example.com:5000 --no-validate-ssl

Nexus docker registry

Add --digest-method flag

registry.py -l user:pass -r https://example.com:5000 --digest-method GET

Important notes:

garbage-collection in docker-registry

  1. docker registry API does not actually delete tags or images, it marks them for later garbage collection. So, make sure you run something like below (or put them in your crontab):
 cd [path-where-your-docker-compose.yml]
docker-compose stop registry
docker-compose run --rm \
registry bin/registry garbage-collect \
/etc/docker/registry/config.yml
docker-compose up -d registry

or (if you are not using docker-compose):

 docker stop registry:2
docker run --rm registry:2 bin/registry garbage-collect \
/etc/docker/registry/config.yml
docker start registry:2

for more detail on garbage collection read here: https://docs.docker.com/registry/garbage-collection/

enable image deletion in docker-registry

Make sure to enable it by either creating environment variable REGISTRY_STORAGE_DELETE_ENABLED: "true" or adding relevant configuration option to the docker-registry's config.yml. For more on docker-registry configuration, read here: https://docs.docker.com/registry/configuration/

You may get Error 405 message from script (Functionality not supported) when this option is not enabled.

Contribution

You are very welcome to contribute to this script. Of course, when making changes, please include your changes into test.py and run tests to check that your changes do not break existing functionality.

For tests to work, more libraries are needed

 pip install -r requirements-ci.txt

Running tests is as simple as

 python test.py

Test will print few error messages, like so

Testing started at 9:31 AM ...
tag digest not found: 400
error 400

this is ok, because test simulates invalid inputs also.

Contact

Please feel free to contact me at anoxis@gmail.com if you wish to add more functionality or want to contribute.

About

Scripts for easy manipulation of docker-registry from command line (and from scripts)

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CircleCI

registry-cli

registry.py is a script for easy manipulation of docker-registry from command line (and from scripts)

Table of Contents

Installation

Docker image

You can download ready-made docker image with the script and all python dependencies pre-installed:

 docker pull anoxis/registry-cli

In this case, replace registry.py with docker run --rm anoxis/registry-cli in all commands below, e.g.

 docker run --rm anoxis/registry-cli -r http://example.com:5000

Note: when you use the docker image and registry on the same computer (registry is on localhost), then due to internal network created by docker you have to link to the registry's network and refer registry container by its name, not localhost. E.g. your registry container is named "registry", then the command to launch registry-cli would be

 docker run --rm --link registry anoxis/registry-cli -r http://registry:5000

python script

Download registry.py and set it as executable

 chmod 755 registry.py

Install dependencies:

 sudo pip install -r requirements-build.txt

Listing images

The below command will list all images and all tags in your registry:

 registry.py -l user:pass -r https://example.com:5000

List all images, tags and layers:

 registry.py -l user:pass -r https://example.com:5000 --layers

List particular image(s) or image:tag (all tags of ubuntu and alpine in this example)

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu alpine

Same as above but with layers

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu alpine --layers

Username and password

It is optional, you can omit it in case if you use insecure registry without authentication (up to you, but its really insecure; make sure you protect your entire registry from anyone)

username and password pair can be provided in the following forms

 -l username:password
-l 'username':'password'
-l "username":"password"

Username cannot contain colon (':') (I don't think it will contain ever, but anyway I warned you). Password, in its turn, can contain as many colons as you wish.

Deleting images

Keep only last 10 versions (useful for CI): Delete all tags of all images but keep last 10 tags (you can put this command to your build script after building images)

 registry.py -l user:pass -r https://example.com:5000 --delete

If number of tags is less than 10 it will not delete any

You can change the number of tags to keep, e.g. 5:

 registry.py -l user:pass -r https://example.com:5000 --delete --num 5

You may also specify tags to be deleted using a list of regexp based names. The following command would delete all tags containing "snapshot-" and beginning with "stable-" and a 4 digit number:

 registry.py -l user:pass -r https://example.com:5000 --delete --tags-like "snapshot-" "^stable-[0-9]{4}.*"

As one manifest may be referenced by more than one tag, you may add tags, whose manifests should NOT be deleted. A tag that would otherwise be deleted, but whose manifest references one of those "kept" tags, is spared for deletion. In the following case, all tags beginning with "snapshot-" will be deleted, save those whose manifest point to "stable" or "latest":

 registry.py -l user:pass -r https://example.com:5000 --delete --tags-like "snapshot-" --keep-tags "stable" "latest"

The last parameter is also available as regexp option with --keep-tags-like.

Delete all tags for particular image (e.g. delete all ubuntu tags):

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu --delete-all

Delete all tags for all images (do you really want to do it?):

 registry.py -l user:pass -r https://example.com:5000 --delete-all --dry-run

Delete all tags by age in hours for the particular image (e.g. older than 24 hours, with --keep-tags and --keep-tags-like options, --dry-run for safe).

 registry.py -r https://example.com:5000 -i api-docs-origin/master --dry-run --delete-by-hours 24 --keep-tags c59c02c25f023263fd4b5d43fc1ff653f08b3d4x --keep-tags-like late

Note that deleting by age will not prevent more recent tags from being deleted if there are more than 10 (or specified --num value). In order to keep all tags within a designated period, use the --keep-by-hours flag:

 registry.py -r https://example.com:5000 --dry-run --delete --keep-by-hours 72 --keep-tags-like latest

Disable ssl verification

If you are using docker registry with a self signed ssl certificate, you can disable ssl verification:

 registry.py -l user:pass -r https://example.com:5000 --no-validate-ssl

Nexus docker registry

Add --digest-method flag

registry.py -l user:pass -r https://example.com:5000 --digest-method GET

Important notes:

garbage-collection in docker-registry

  1. docker registry API does not actually delete tags or images, it marks them for later garbage collection. So, make sure you run something like below (or put them in your crontab):
 cd [path-where-your-docker-compose.yml]
docker-compose stop registry
docker-compose run --rm \
registry bin/registry garbage-collect \
/etc/docker/registry/config.yml
docker-compose up -d registry

or (if you are not using docker-compose):

 docker stop registry:2
docker run --rm registry:2 bin/registry garbage-collect \
/etc/docker/registry/config.yml
docker start registry:2

for more detail on garbage collection read here: https://docs.docker.com/registry/garbage-collection/

enable image deletion in docker-registry

Make sure to enable it by either creating environment variable REGISTRY_STORAGE_DELETE_ENABLED: "true" or adding relevant configuration option to the docker-registry's config.yml. For more on docker-registry configuration, read here: https://docs.docker.com/registry/configuration/

You may get Error 405 message from script (Functionality not supported) when this option is not enabled.

Contribution

You are very welcome to contribute to this script. Of course, when making changes, please include your changes into test.py and run tests to check that your changes do not break existing functionality.

For tests to work, more libraries are needed

 pip install -r requirements-ci.txt

Running tests is as simple as

 python test.py

Test will print few error messages, like so

Testing started at 9:31 AM ...
tag digest not found: 400
error 400

this is ok, because test simulates invalid inputs also.

Contact

Please feel free to contact me at anoxis@gmail.com if you wish to add more functionality or want to contribute.

About

Scripts for easy manipulation of docker-registry from command line (and from scripts)

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

CircleCI

registry-cli

registry.py is a script for easy manipulation of docker-registry from command line (and from scripts)

Table of Contents

Installation

Docker image

You can download ready-made docker image with the script and all python dependencies pre-installed:

 docker pull anoxis/registry-cli

In this case, replace registry.py with docker run --rm anoxis/registry-cli in all commands below, e.g.

 docker run --rm anoxis/registry-cli -r http://example.com:5000

Note: when you use the docker image and registry on the same computer (registry is on localhost), then due to internal network created by docker you have to link to the registry's network and refer registry container by its name, not localhost. E.g. your registry container is named "registry", then the command to launch registry-cli would be

 docker run --rm --link registry anoxis/registry-cli -r http://registry:5000

python script

Download registry.py and set it as executable

 chmod 755 registry.py

Install dependencies:

 sudo pip install -r requirements-build.txt

Listing images

The below command will list all images and all tags in your registry:

 registry.py -l user:pass -r https://example.com:5000

List all images, tags and layers:

 registry.py -l user:pass -r https://example.com:5000 --layers

List particular image(s) or image:tag (all tags of ubuntu and alpine in this example)

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu alpine

Same as above but with layers

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu alpine --layers

Username and password

It is optional, you can omit it in case if you use insecure registry without authentication (up to you, but its really insecure; make sure you protect your entire registry from anyone)

username and password pair can be provided in the following forms

 -l username:password
-l 'username':'password'
-l "username":"password"

Username cannot contain colon (':') (I don't think it will contain ever, but anyway I warned you). Password, in its turn, can contain as many colons as you wish.

Deleting images

Keep only last 10 versions (useful for CI): Delete all tags of all images but keep last 10 tags (you can put this command to your build script after building images)

 registry.py -l user:pass -r https://example.com:5000 --delete

If number of tags is less than 10 it will not delete any

You can change the number of tags to keep, e.g. 5:

 registry.py -l user:pass -r https://example.com:5000 --delete --num 5

You may also specify tags to be deleted using a list of regexp based names. The following command would delete all tags containing "snapshot-" and beginning with "stable-" and a 4 digit number:

 registry.py -l user:pass -r https://example.com:5000 --delete --tags-like "snapshot-" "^stable-[0-9]{4}.*"

As one manifest may be referenced by more than one tag, you may add tags, whose manifests should NOT be deleted. A tag that would otherwise be deleted, but whose manifest references one of those "kept" tags, is spared for deletion. In the following case, all tags beginning with "snapshot-" will be deleted, save those whose manifest point to "stable" or "latest":

 registry.py -l user:pass -r https://example.com:5000 --delete --tags-like "snapshot-" --keep-tags "stable" "latest"

The last parameter is also available as regexp option with --keep-tags-like.

Delete all tags for particular image (e.g. delete all ubuntu tags):

 registry.py -l user:pass -r https://example.com:5000 -i ubuntu --delete-all

Delete all tags for all images (do you really want to do it?):

 registry.py -l user:pass -r https://example.com:5000 --delete-all --dry-run

Delete all tags by age in hours for the particular image (e.g. older than 24 hours, with --keep-tags and --keep-tags-like options, --dry-run for safe).

 registry.py -r https://example.com:5000 -i api-docs-origin/master --dry-run --delete-by-hours 24 --keep-tags c59c02c25f023263fd4b5d43fc1ff653f08b3d4x --keep-tags-like late

Note that deleting by age will not prevent more recent tags from being deleted if there are more than 10 (or specified --num value). In order to keep all tags within a designated period, use the --keep-by-hours flag:

 registry.py -r https://example.com:5000 --dry-run --delete --keep-by-hours 72 --keep-tags-like latest

Disable ssl verification

If you are using docker registry with a self signed ssl certificate, you can disable ssl verification:

 registry.py -l user:pass -r https://example.com:5000 --no-validate-ssl

Nexus docker registry

Add --digest-method flag

registry.py -l user:pass -r https://example.com:5000 --digest-method GET

Important notes:

garbage-collection in docker-registry

  1. docker registry API does not actually delete tags or images, it marks them for later garbage collection. So, make sure you run something like below (or put them in your crontab):
 cd [path-where-your-docker-compose.yml]
docker-compose stop registry
docker-compose run --rm \
registry bin/registry garbage-collect \
/etc/docker/registry/config.yml
docker-compose up -d registry

or (if you are not using docker-compose):

 docker stop registry:2
docker run --rm registry:2 bin/registry garbage-collect \
/etc/docker/registry/config.yml
docker start registry:2

for more detail on garbage collection read here: https://docs.docker.com/registry/garbage-collection/

enable image deletion in docker-registry

Make sure to enable it by either creating environment variable REGISTRY_STORAGE_DELETE_ENABLED: "true" or adding relevant configuration option to the docker-registry's config.yml. For more on docker-registry configuration, read here: https://docs.docker.com/registry/configuration/

You may get Error 405 message from script (Functionality not supported) when this option is not enabled.

Contribution

You are very welcome to contribute to this script. Of course, when making changes, please include your changes into test.py and run tests to check that your changes do not break existing functionality.

For tests to work, more libraries are needed

 pip install -r requirements-ci.txt

Running tests is as simple as

 python test.py

Test will print few error messages, like so

Testing started at 9:31 AM ...
tag digest not found: 400
error 400

this is ok, because test simulates invalid inputs also.

Contact

Please feel free to contact me at anoxis@gmail.com if you wish to add more functionality or want to contribute.

About

Scripts for easy manipulation of docker-registry from command line (and from scripts)

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages