|Build Status| |Coverage Status| |PyPI version|
Python module and command-line tool for storing and retrieving data in a
Docker registry.
- Store arbitrary data (blob-store)
- Content addressable
- Set up named aliases to blobs
- Supports Docker registry schema v2
- Works on Python 3.8+
Please note that ``dxf`` does *not* generate Docker container
configuration, so you won’t be able to ``docker pull`` data you store
using ``dxf``. See `this
issue <https://github.com/davedoesdev/dxf/issues/3>`__ for more details.
Command-line example:
.. code:: shell
dxf push-blob fred/datalogger logger.dat @may15-readings
dxf pull-blob fred/datalogger @may15-readings
which is the same as:
.. code:: shell
dxf set-alias fred/datalogger may15-readings $(dxf push-blob fred/datalogger logger.dat)
dxf pull-blob fred/datalogger $(dxf get-alias fred/datalogger may15-readings)
Module example:
.. code:: python
from dxf import DXF
def auth(dxf, response):
dxf.authenticate('fred', 'somepassword', response=response)
dxf = DXF('registry-1.docker.io', 'fred/datalogger', auth)
dgst = dxf.push_blob('logger.dat')
dxf.set_alias('may15-readings', dgst)
assert dxf.get_alias('may15-readings') == [dgst]
for chunk in dxf.pull_blob(dgst):
sys.stdout.write(chunk)
Usage
-----
The module API is described
`here <http://rawgit.davedoesdev.com/davedoesdev/dxf/master/docs/_build/html/index.html>`__.
The ``dxf`` command-line tool uses the following environment variables:
- ``DXF_HOST`` - Host where Docker registry is running.
- ``DXF_INSECURE`` - Set this to ``1`` if you want to connect to the
registry using ``http`` rather than ``https`` (which is the default).
- ``DXF_USERNAME`` - Name of user to authenticate as.
- ``DXF_PASSWORD`` - User’s password.
- ``DXF_AUTHORIZATION`` - HTTP ``Authorization`` header value.
- ``DXF_AUTH_HOST`` - If set, always perform token authentication to
this host, overriding the value returned by the registry.
- ``DXF_PROGRESS`` - If this is set to ``1``, a progress bar is
displayed (on standard error) during ``push-blob`` and ``pull-blob``.
If this is set to ``0``, a progress bar is not displayed. If this is
set to any other value, a progress bar is only displayed if standard
error is a terminal.
- ``DXF_BLOB_INFO`` - Set this to ``1`` if you want ``pull-blob`` to
prepend each blob with its digest and size (printed in plain text,
separated by a space and followed by a newline).
- ``DXF_CHUNK_SIZE`` - Number of bytes ``pull-blob`` should download at
a time. Defaults to 8192.
- ``DXF_SKIPTLSVERIFY`` - Set this to ``1`` to skip TLS certificate
verification.
- ``DXF_TLSVERIFY`` - Optional path to custom CA bundle to use for TLS
verification.
- ``DXF_PLATFORM`` - Optional platform (e.g. ``linux/amd64``) to use
for multi-arch manifests. If a multi-arch manifest is encountered and
this is not set then a dict containing entries for each platform will
be displayed.
You can use the following options with ``dxf``. Supply the name of the
repository you wish to work with in each case as the second argument.
- ``dxf push-blob <repo> <file> [@alias]``
Upload a file to the registry and optionally give it a name
(alias). The blob’s hash is printed to standard output.
..
The hash or the alias can be used to fetch the blob later using
``pull-blob``.
- ``dxf pull-blob <repo> <hash>|<@alias>...``
Download blobs from the registry to standard output. For each blob
you can specify its hash, prefixed by ``sha256:`` (remember the
registry is content-addressable) or an alias you’ve given it
(using ``push-blob`` or ``set-alias``).
- ``dxf blob-size <repo> <hash>|<@alias>...``
Print the size of blobs in the registry. If you specify an alias,
the sum of all the blobs it points to will be printed.
- ``dxf mount-blob <repo> <from-repo> <hash> [@alias]``
Cross mount a blob from another repository and optionally give it
an alias. Specify the blob by its hash, prefixed by ``sha256:``.
..
This is useful to avoid having to upload a blob to your repository
if you know it already exists in the registry.
- ``dxf del-blob <repo> <hash>|<@alias>...``
Delete blobs from the registry. If you specify an alias the blobs
it points to will be deleted, not the alias itself. Use
``del-alias`` for that.
- ``dxf set-alias <repo> <alias> <hash>|<file>...``
Give a name (alias) to a set of blobs. For each blob you can
either specify its hash (as printed by ``push-blob`` or
``get-alias``) or, if you have the blob’s contents on disk, its
filename (including a path separator to distinguish it from a
hash).
- ``dxf get-alias <repo> <alias>...``
For each alias you specify, print the hashes of all the blobs it
points to.
- ``dxf del-alias <repo> <alias>...``
Delete each specified alias. The blobs they point to won’t be
deleted (use ``del-blob`` for that), but their hashes will be
printed.
- ``dxf get-digest <repo> <alias>...``
For each alias you specify, print the hash of its configuration
blob. For an alias created using ``dxf``, this is the hash of the
first blob it points to. For a Docker image tag, this is the same
as ``docker inspect alias --format='{{.Id}}'``.
- ``dxf get-manifest <repo> <alias>...``
For each alias you specify, print its manifest obtained from the
registry.
- ``dxf list-aliases <repo>``
Print all the aliases defined in the repository.
- ``dxf list-repos``
Print the names of all the repositories in the registry. Not all
versions of the registry support this.
Certificates
------------
If your registry uses SSL with a self-issued certificate, you’ll need to
supply ``dxf`` with a set of trusted certificate authorities.
Set the ``REQUESTS_CA_BUNDLE`` environment variable to the path of a PEM
file containing the trusted certificate authority certificates.
Both the module and command-line tool support ``REQUESTS_CA_BUNDLE``.
Alternatively, you can set the ``DXF_TLSVERIFY`` environment variable
for the command-line tool or pass the ``tlsverify`` option to the
module.
Authentication tokens
---------------------
``dxf`` automatically obtains Docker registry authentication tokens
using your ``DXF_USERNAME`` and ``DXF_PASSWORD``, or
``DXF_AUTHORIZATION``, environment variables as necessary.
However, if you wish to override this then you can use the following
command:
- ``dxf auth <repo> <action>...``
Authenticate to the registry using ``DXF_USERNAME`` and
``DXF_PASSWORD``, or ``DXF_AUTHORIZATION``, and print the
resulting token.
..
``action`` can be ``pull``, ``push`` or ``*``.
If you assign the token to the ``DXF_TOKEN`` environment variable, for
example:
``DXF_TOKEN=$(dxf auth fred/datalogger pull)``
then subsequent ``dxf`` commands will use the token without needing
``DXF_USERNAME`` and ``DXF_PASSWORD``, or ``DXF_AUTHORIZATION``, to be
set.
Note however that the token expires after a few minutes, after which
``dxf`` will exit with ``EACCES``.
Docker Cloud authentication
---------------------------
You can use the
```dockercloud`` <https://github.com/docker/python-dockercloud>`__
library to read authentication information from your Docker
configuration file and pass it to ``dxf``:
.. code:: python
auth = 'Basic ' + dockercloud.api.auth.load_from_file()
dxf_obj = dxf.DXF('index.docker.io', repo='myorganization/myimage')
dxf_obj.authenticate(authorization=auth, actions=['pull'])
dxf_obj.list_aliases()
Thanks to `cyrilleverrier <https://github.com/cyrilleverrier>`__ for
this tip.
Installation
------------
.. code:: shell
pip install python-dxf
Licence
-------
`MIT <https://raw.github.com/davedoesdev/dxf/master/LICENCE>`__
Other projects that use DXF
---------------------------
Docker-charon
~~~~~~~~~~~~~
https://github.com/gabrieldemarmiesse/docker-charon
This package allows you to transfer Docker images from one registry to
another. The second one being disconnected from the internet.
Unlike ``docker save`` and ``docker load``, it creates the payload
directly from the registry (it’s faster) and is able to compute diffs to
only take the layers needed, hence reducing the size.
Tests
-----
.. code:: shell
make test
Lint
----
.. code:: shell
make lint
Code Coverage
-------------
.. code:: shell
make coverage
`coverage.py <http://nedbatchelder.com/code/coverage/>`__ results are
available
`here <http://rawgit.davedoesdev.com/davedoesdev/dxf/master/htmlcov/index.html>`__.
Coveralls page is `here <https://coveralls.io/r/davedoesdev/dxf>`__.
.. |Build Status| image:: https://github.com/davedoesdev/dxf/workflows/ci/badge.svg
:target: https://github.com/davedoesdev/dxf/actions
.. |Coverage Status| image:: https://coveralls.io/repos/davedoesdev/dxf/badge.png?branch=master
:target: https://coveralls.io/r/davedoesdev/dxf?branch=master
.. |PyPI version| image:: https://badge.fury.io/py/python-dxf.png
:target: http://badge.fury.io/py/python-dxf
Raw data
{
"_id": null,
"home_page": "https://github.com/davedoesdev/dxf",
"name": "python-dxf",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "docker registry",
"author": "David Halls",
"author_email": "dave@davedoesdev.com",
"download_url": "https://files.pythonhosted.org/packages/cc/f6/aac11aa8d64d39706838d57ace0b5ba5c31af157019e96c1bf2a8930563d/python_dxf-12.1.0.tar.gz",
"platform": null,
"description": "|Build Status| |Coverage Status| |PyPI version|\n\nPython module and command-line tool for storing and retrieving data in a\nDocker registry.\n\n- Store arbitrary data (blob-store)\n- Content addressable\n- Set up named aliases to blobs\n- Supports Docker registry schema v2\n- Works on Python 3.8+\n\nPlease note that ``dxf`` does *not* generate Docker container\nconfiguration, so you won\u2019t be able to ``docker pull`` data you store\nusing ``dxf``. See `this\nissue <https://github.com/davedoesdev/dxf/issues/3>`__ for more details.\n\nCommand-line example:\n\n.. code:: shell\n\n dxf push-blob fred/datalogger logger.dat @may15-readings\n dxf pull-blob fred/datalogger @may15-readings\n\nwhich is the same as:\n\n.. code:: shell\n\n dxf set-alias fred/datalogger may15-readings $(dxf push-blob fred/datalogger logger.dat)\n dxf pull-blob fred/datalogger $(dxf get-alias fred/datalogger may15-readings)\n\nModule example:\n\n.. code:: python\n\n from dxf import DXF\n\n def auth(dxf, response):\n dxf.authenticate('fred', 'somepassword', response=response)\n\n dxf = DXF('registry-1.docker.io', 'fred/datalogger', auth)\n\n dgst = dxf.push_blob('logger.dat')\n dxf.set_alias('may15-readings', dgst)\n\n assert dxf.get_alias('may15-readings') == [dgst]\n\n for chunk in dxf.pull_blob(dgst):\n sys.stdout.write(chunk)\n\nUsage\n-----\n\nThe module API is described\n`here <http://rawgit.davedoesdev.com/davedoesdev/dxf/master/docs/_build/html/index.html>`__.\n\nThe ``dxf`` command-line tool uses the following environment variables:\n\n- ``DXF_HOST`` - Host where Docker registry is running.\n- ``DXF_INSECURE`` - Set this to ``1`` if you want to connect to the\n registry using ``http`` rather than ``https`` (which is the default).\n- ``DXF_USERNAME`` - Name of user to authenticate as.\n- ``DXF_PASSWORD`` - User\u2019s password.\n- ``DXF_AUTHORIZATION`` - HTTP ``Authorization`` header value.\n- ``DXF_AUTH_HOST`` - If set, always perform token authentication to\n this host, overriding the value returned by the registry.\n- ``DXF_PROGRESS`` - If this is set to ``1``, a progress bar is\n displayed (on standard error) during ``push-blob`` and ``pull-blob``.\n If this is set to ``0``, a progress bar is not displayed. If this is\n set to any other value, a progress bar is only displayed if standard\n error is a terminal.\n- ``DXF_BLOB_INFO`` - Set this to ``1`` if you want ``pull-blob`` to\n prepend each blob with its digest and size (printed in plain text,\n separated by a space and followed by a newline).\n- ``DXF_CHUNK_SIZE`` - Number of bytes ``pull-blob`` should download at\n a time. Defaults to 8192.\n- ``DXF_SKIPTLSVERIFY`` - Set this to ``1`` to skip TLS certificate\n verification.\n- ``DXF_TLSVERIFY`` - Optional path to custom CA bundle to use for TLS\n verification.\n- ``DXF_PLATFORM`` - Optional platform (e.g.\u00a0``linux/amd64``) to use\n for multi-arch manifests. If a multi-arch manifest is encountered and\n this is not set then a dict containing entries for each platform will\n be displayed.\n\nYou can use the following options with ``dxf``. Supply the name of the\nrepository you wish to work with in each case as the second argument.\n\n- ``dxf push-blob <repo> <file> [@alias]``\n\n Upload a file to the registry and optionally give it a name\n (alias). The blob\u2019s hash is printed to standard output.\n\n ..\n\n The hash or the alias can be used to fetch the blob later using\n ``pull-blob``.\n\n- ``dxf pull-blob <repo> <hash>|<@alias>...``\n\n Download blobs from the registry to standard output. For each blob\n you can specify its hash, prefixed by ``sha256:`` (remember the\n registry is content-addressable) or an alias you\u2019ve given it\n (using ``push-blob`` or ``set-alias``).\n\n- ``dxf blob-size <repo> <hash>|<@alias>...``\n\n Print the size of blobs in the registry. If you specify an alias,\n the sum of all the blobs it points to will be printed.\n\n- ``dxf mount-blob <repo> <from-repo> <hash> [@alias]``\n\n Cross mount a blob from another repository and optionally give it\n an alias. Specify the blob by its hash, prefixed by ``sha256:``.\n\n ..\n\n This is useful to avoid having to upload a blob to your repository\n if you know it already exists in the registry.\n\n- ``dxf del-blob <repo> <hash>|<@alias>...``\n\n Delete blobs from the registry. If you specify an alias the blobs\n it points to will be deleted, not the alias itself. Use\n ``del-alias`` for that.\n\n- ``dxf set-alias <repo> <alias> <hash>|<file>...``\n\n Give a name (alias) to a set of blobs. For each blob you can\n either specify its hash (as printed by ``push-blob`` or\n ``get-alias``) or, if you have the blob\u2019s contents on disk, its\n filename (including a path separator to distinguish it from a\n hash).\n\n- ``dxf get-alias <repo> <alias>...``\n\n For each alias you specify, print the hashes of all the blobs it\n points to.\n\n- ``dxf del-alias <repo> <alias>...``\n\n Delete each specified alias. The blobs they point to won\u2019t be\n deleted (use ``del-blob`` for that), but their hashes will be\n printed.\n\n- ``dxf get-digest <repo> <alias>...``\n\n For each alias you specify, print the hash of its configuration\n blob. For an alias created using ``dxf``, this is the hash of the\n first blob it points to. For a Docker image tag, this is the same\n as ``docker inspect alias --format='{{.Id}}'``.\n\n- ``dxf get-manifest <repo> <alias>...``\n\n For each alias you specify, print its manifest obtained from the\n registry.\n\n- ``dxf list-aliases <repo>``\n\n Print all the aliases defined in the repository.\n\n- ``dxf list-repos``\n\n Print the names of all the repositories in the registry. Not all\n versions of the registry support this.\n\nCertificates\n------------\n\nIf your registry uses SSL with a self-issued certificate, you\u2019ll need to\nsupply ``dxf`` with a set of trusted certificate authorities.\n\nSet the ``REQUESTS_CA_BUNDLE`` environment variable to the path of a PEM\nfile containing the trusted certificate authority certificates.\n\nBoth the module and command-line tool support ``REQUESTS_CA_BUNDLE``.\n\nAlternatively, you can set the ``DXF_TLSVERIFY`` environment variable\nfor the command-line tool or pass the ``tlsverify`` option to the\nmodule.\n\nAuthentication tokens\n---------------------\n\n``dxf`` automatically obtains Docker registry authentication tokens\nusing your ``DXF_USERNAME`` and ``DXF_PASSWORD``, or\n``DXF_AUTHORIZATION``, environment variables as necessary.\n\nHowever, if you wish to override this then you can use the following\ncommand:\n\n- ``dxf auth <repo> <action>...``\n\n Authenticate to the registry using ``DXF_USERNAME`` and\n ``DXF_PASSWORD``, or ``DXF_AUTHORIZATION``, and print the\n resulting token.\n\n ..\n\n ``action`` can be ``pull``, ``push`` or ``*``.\n\nIf you assign the token to the ``DXF_TOKEN`` environment variable, for\nexample:\n\n``DXF_TOKEN=$(dxf auth fred/datalogger pull)``\n\nthen subsequent ``dxf`` commands will use the token without needing\n``DXF_USERNAME`` and ``DXF_PASSWORD``, or ``DXF_AUTHORIZATION``, to be\nset.\n\nNote however that the token expires after a few minutes, after which\n``dxf`` will exit with ``EACCES``.\n\nDocker Cloud authentication\n---------------------------\n\nYou can use the\n```dockercloud`` <https://github.com/docker/python-dockercloud>`__\nlibrary to read authentication information from your Docker\nconfiguration file and pass it to ``dxf``:\n\n.. code:: python\n\n auth = 'Basic ' + dockercloud.api.auth.load_from_file()\n dxf_obj = dxf.DXF('index.docker.io', repo='myorganization/myimage')\n dxf_obj.authenticate(authorization=auth, actions=['pull'])\n dxf_obj.list_aliases()\n\nThanks to `cyrilleverrier <https://github.com/cyrilleverrier>`__ for\nthis tip.\n\nInstallation\n------------\n\n.. code:: shell\n\n pip install python-dxf\n\nLicence\n-------\n\n`MIT <https://raw.github.com/davedoesdev/dxf/master/LICENCE>`__\n\nOther projects that use DXF\n---------------------------\n\nDocker-charon\n~~~~~~~~~~~~~\n\nhttps://github.com/gabrieldemarmiesse/docker-charon\n\nThis package allows you to transfer Docker images from one registry to\nanother. The second one being disconnected from the internet.\n\nUnlike ``docker save`` and ``docker load``, it creates the payload\ndirectly from the registry (it\u2019s faster) and is able to compute diffs to\nonly take the layers needed, hence reducing the size.\n\nTests\n-----\n\n.. code:: shell\n\n make test\n\nLint\n----\n\n.. code:: shell\n\n make lint\n\nCode Coverage\n-------------\n\n.. code:: shell\n\n make coverage\n\n`coverage.py <http://nedbatchelder.com/code/coverage/>`__ results are\navailable\n`here <http://rawgit.davedoesdev.com/davedoesdev/dxf/master/htmlcov/index.html>`__.\n\nCoveralls page is `here <https://coveralls.io/r/davedoesdev/dxf>`__.\n\n.. |Build Status| image:: https://github.com/davedoesdev/dxf/workflows/ci/badge.svg\n :target: https://github.com/davedoesdev/dxf/actions\n.. |Coverage Status| image:: https://coveralls.io/repos/davedoesdev/dxf/badge.png?branch=master\n :target: https://coveralls.io/r/davedoesdev/dxf?branch=master\n.. |PyPI version| image:: https://badge.fury.io/py/python-dxf.png\n :target: http://badge.fury.io/py/python-dxf\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Package for accessing a Docker v2 registry",
"version": "12.1.0",
"project_urls": {
"Homepage": "https://github.com/davedoesdev/dxf"
},
"split_keywords": [
"docker",
"registry"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "6a4213c339c0ee380b432fc638fe39818fc8f0aaede5712e55990c22d5e317a6",
"md5": "6a07eb474b295221d901e4e7524039ff",
"sha256": "e374eeebf7e5e901f8ba916753bf7e3988993311ad179ac91a72e229abff3d6c"
},
"downloads": -1,
"filename": "python_dxf-12.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "6a07eb474b295221d901e4e7524039ff",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 17929,
"upload_time": "2024-06-15T19:57:12",
"upload_time_iso_8601": "2024-06-15T19:57:12.960303Z",
"url": "https://files.pythonhosted.org/packages/6a/42/13c339c0ee380b432fc638fe39818fc8f0aaede5712e55990c22d5e317a6/python_dxf-12.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ccf6aac11aa8d64d39706838d57ace0b5ba5c31af157019e96c1bf2a8930563d",
"md5": "f90b835cee28fe9db0dc0e7388664bff",
"sha256": "59ff22c0ab92a29fb3085f65ea70c0e8c7ff9fdfd74db0109efd5dfdc404d96c"
},
"downloads": -1,
"filename": "python_dxf-12.1.0.tar.gz",
"has_sig": false,
"md5_digest": "f90b835cee28fe9db0dc0e7388664bff",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 25980,
"upload_time": "2024-06-15T19:57:15",
"upload_time_iso_8601": "2024-06-15T19:57:15.807312Z",
"url": "https://files.pythonhosted.org/packages/cc/f6/aac11aa8d64d39706838d57ace0b5ba5c31af157019e96c1bf2a8930563d/python_dxf-12.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-06-15 19:57:15",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "davedoesdev",
"github_project": "dxf",
"travis_ci": false,
"coveralls": true,
"github_actions": true,
"requirements": [],
"lcname": "python-dxf"
}