{ "info": { "author": "Resero-Labs", "author_email": "", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "[![TravisCI](https://api.travis-ci.org/resero-labs/docker-utils.svg?branch=master)](https://travis-ci.org/resero-labs/docker-utils) [![Coverage](https://codecov.io/gh/resero-labs/docker-utils/branch/master/graph/badge.svg)](https://codecov.io/gh/resero-labs/docker-utils) [![PyPi](https://img.shields.io/pypi/v/dockerutils.svg)](https://pypi.org/project/dockerutils/) [![PyPi](https://img.shields.io/pypi/wheel/dockerutils.svg)](https://pypi.org/project/dockerutils/) \n[![Python 3.7](https://img.shields.io/badge/python-3.7-blue.svg)](https://www.python.org/downloads/release/python-370/) \n[![Python 3.6](https://img.shields.io/badge/python-3.6-blue.svg)](https://www.python.org/downloads/release/python-360/) \n[![Python 3.5](https://img.shields.io/badge/python-3.5-blue.svg)](https://www.python.org/downloads/release/python-350/) \n[![Python 3.4](https://img.shields.io/badge/python-3.4-blue.svg)](https://www.python.org/downloads/release/python-340/) \n[![Python 2.7](https://img.shields.io/badge/python-2.7-blue.svg)](https://www.python.org/downloads/release/python-270/) \n\n# Docker Utilities/Patterns\n\nDockerutils is a set of utilities and conventions around their use. The intent behind these utilities is to provide a \nvery light layer of abstraction to: simplify interaction with docker; support seamlessly running docker locally or on \nec2 instance in AWS; allow for multiple images per project; etc.\n\nPerhaps the best way to think of dockerutils is that it embodies two entities, commonly used when working\nwith docker, and a set of complementary commands for working with those entities. The two entities are:\n* \"dock\" - the server that is hosing docker (by default, localhost)\n* image - the standard docker image\n\nThe commands used to operate against these entities are:\n\n| CommandSet / Entity | Creation | Execution | Notebook | Utility |\n|----------------------|:------------------------:|:--------------------:|:------------:|:----------------------------:|\n| Dock | create-dock
destroy-dock | start-dock
stop-dock | nb-dock | source dock
ls-dock
ssh-dock |\n| Image | build-image | run-image | run-notebook | publish-image
transfer-image |\n\nPossible use cases include:\n* seperating development/test dependencies out of production container, e.g. production container vs. dev/test container\n* seperating data science notebook container from execution container\n* environment experimentation\n* cases in which you want to \"freeze\" any external dependencies in one container and use that as a base\nfor containers that are dependent solely on the project\n\n## Conventions\n\n1) Create a docker directory tree at the root of the project\n\n In this directory tree there should be one sub-directory for each unique docker container type that is desired.\n Each of these sub-directories would contain the `Dockerfile` that will be used to create the image\n as well as any source specific to that image.\n2) Use versioneer for project versioning (Optional). \n\n As part of the image build, a file, `_version.py.bld`, will be generated and placed at the project \n root. A `Dockerfile` can add that file to the image on creation to prevent the need for including the\n .git directory tree in the container context (usually quite expensive).\n3) Create a docker/base directory to make use of built in external dependency isolation (optional)\n\n This capability supports environments where a docker build isn't able to access external dependencies (Docker Hub, \n pypi, etc.), for instance a server in a \"locked-down\" environment. A base image can be defined to isolate any \n dependencies that are required. That image can then be built and `transfer-image` used to transfer the base image \n to the target environment.\n\n Subsequent images can be built based off of that image that are \"self-contained\" (relying only on source\n from the project). The remote docker api can then be used to quickly iterate only requiring the more\n cumbersome transfer-image to be used when external dependencies change.\n4) Building and running images controlled through configuration (/docker/dockerutils.cfg)\n\n Includes setting most docker parameters, i.e. volume mounts, ports, networks, commands, etc. with\n replacement varilable support for things like user, project root, etc.\n\n## Command-line Interface\n\n### Image cli\n`build-image` takes the name of one of the sub-directories in the `docker` directory and builds the\nimage defined therein. The image is named \\-\\:\\\n\n`run-image` takes the name of one of the sub-directories (or one of the synthetic images defined in `dockerutils.cfg`), \ntogether with any of the configuration for that image defined in `dockerutils.cfg` and starts a docker container\n\n`transfer-image` takes a docker image name and uses docker `save` and `load` to transfer the image to a remote host\n\n`publish-image` takes the name of one of the sub-directories in the `docker` directory and pushes the image built by \nthe docker file to the defined repository (AWS or Docker)\n\n### Notebook cli\n`run-notebook` will start a docker container using either the notebook container found in the `docker/notebook` directory\nif it exists, or [resero-labs/docker-ds](https://github.com/resero-labs/docker-ds) otherwise. The current directory will be mounted\ninto the container for use in the Juypter notebook environment. There are a couple of environment variable to be aware of \nwith this command:\n\n* DOCKER_DS_DONT_PULL - if set, the version of resero-labs/docker-ds currently available will be used rather than pulling \nthe latest version from docker hub.\n* RESERO_JUPYTER_DIFFS - if set, on save, `.py` files and `.html` files for the notebook will be created in a `.diffs` subdirectory. \n\n### Dock cli\n\nA \"dock\" is a remote system that you can connect to through `ssh`. You can \"dock\" your terminal to a remote instance and\nany docker commands, including image and notebook cli above will be run against the remote docker server. Once a \"dock\"\nis created, you can dock your terminal by issuing the command `source dock `\n\n`create-dock` (`register-dock` if provisioning from AWS console) is used to add a remote system to the dock list with all its configuration (username, ip and a moniker)\n\n`destroy-dock` (`unregister-dock` if provisioned from AWS console) is used to remove the reference to the remote system\n\n`stop-dock` will change the instances state of a remote dock to `stopped`\n\n`start-dock` will change the instance state of a remote dock to `running`\n\n`ssh-dock` opens a terminal on the remote dock with ssh\n\n`ls-dock` list (including state) any created docks\n\n`nb-dock` run jupyter on the bare AMI of the dock and open a browser window to the notebook server\n\n## `dockerutils.cfg` Format\nConfiguration in `docker/dockerutils.cfg` is used to configure behavior of the `dockerutils` scripts.\n\n### Image Section\nThe `dockerutils.cfg` file format allows for configuration sections named corresponding to the sub-directories in the \ndocker directory tree. Each of these sections may contain one of the following:\n\n* `environment` - in the form of (`-e VAR=value`)+ to pass environment into the container\n* `interactive` - either -e or -it\n* `gpu` - conforms to NVIDIA Docker 2.0 specification, e.g. `--runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all`, \n`run-image -g` will add this automatically\n* `network` - the name of the network for the container\n* `volumes` - in the form of (`-v :`)+ or (`--mount ...`)+ or both\n* `ports` - in the form of (`-p :`)+\n* `cmd` - any valid Docker `CMD` specification\n* `pull_FROM_on_force` - defaults to False, if True, add --pull to build command when force building image (or base image)\n* `image_repo` - the repository to publish the image to\n* `publication_tag` - the tag for publication (full image name + tag) \n* `pre_build_script` - A shell command or script to run before a docker build is issued\n* `post_build_script` - A shell command or script to run after a docker build has been compeleted (successfully)\n\n### Synthetic Images\nAdditionally, \"synthetic\" images can be specified by adding a `run-image` section with a `synthetic_images` definition\nthat contains a list of \"synthetic\" images. Each of these may also have a named section as defined for the docker\nsub-directories, but must also contain a `name` value that resolves to one of the docker sub-directories. For example:\n\n```\n[run_image]\nsynthetic_images=shell\n\n[shell]\nname=dev\n...\n```\n\n### Configuration-only Images\nIf there is a docker container that does what you want already, you can create a configuration-only image by \nspecifying `name`, `tag` and `prefix=False` in the configuration section for the image. For example the base notebook \nimage `resero-labs/docker-ds` is often sufficient for running a Jupyter notebook against your code, as it auto detects a \n`setup.py` upon container start and installs the module into the notebook environment.\n\n### Image Tagging\nThe default tag for any image created/run/etc. is the user name in the host environment when running the \nutility. This can be overriden by adding a `tag` value to the desired section. For example:\n\n```\n[dev]\ntag=experiment.2017.12.16\n...\n```\n### Volume Replacement Variables\n\nThe volume specification may contain either environment variables (`$name` and `${name}` formats) as well as specific\nvariable replacement designations of the form `{var}`. The supported variables include:\n\n* `project_root` - will be replaced with the root directory name of the project\n* `user` - will be replaced with the user name of the user running the command\n* `project` - will be replaced with project name\n* `home` - will be replaced with the user's home directory\n\n### Image Push Replacement Variables\n\nThe `publication_tag` may contain either environment variables (`$name` and `${name}` formats) as well as specific\nvariable replacement designations of the form `{var}`. The supported variables include:\n\n* `account` - AWS account designation\n* `region` - AWS region\n* `image` - Image name\n* `tag` - Image tag \n* `user` - will be replaced with the user name of the user running the command\n\n### Publish to AWS\nIn order to publish to AWS, the repository will be the image name and the following should\nbe configured for images that are published to AWS\n\n```\nimage_repo=aws\npublication_tag={account}.dkr.ecr.{region}.amazonaws.com/{image}:{tag}\"\n```\n\n## Patterns\n\n### Running your code in container, making live modifications outside container in your editor of choice \n\nIf you're like me, you have a whole set of tools in your host environment that you use to work with your project.\nOne of the disadvantages of working with Docker can be the difficulty of transplanting those tools into the container\nenvironment. Perhaps there is a way to have your cake and eat it too!\nThe `dev` example does a reasonable job of doing just this. \n\nWith this pattern, you create a `Dockerfile` that has everything in the image *except* for your project source. An\nempty `WORKDIR` is created and then `ENTRYPOINT` even does a `pip install -e` of the contents of the empty `WORKDIR`. \nWe get the desired results by mounting the source project directory into the container's `WORKDIR` (see `dev` section\nof `docker/dockertuils.cfg`).\n\nWith this pattern you can run tests, experiment, etc. in container, make changes to the project in your host \nenvironment toolset and immediately observe the changes that were made.\n\n### Working with a server in a locked-down environment\nYou may find yourself in a situation in which you need to work with a server hosting Docker in an environment that has\nlimited access to the \"outside world\". This pattern can be used to capture all external dependencies in a base \nimage that is built in an environment that is open, use `transfer-image` to send this base image to the server and\nthen utilize a derived image dependent just on project sources and the base image to iterate without requiring open\naccess on the server.\n\n### Adding test frameworks, code analysis tools, etc. to a container for testing/validation\n\n### Tensorflow for both CPU and GPU in the same container\nIt is sometimes useful to try both the CPU and GPU versions of Tensorflow. The example in `docker/tensorflow` provides\na pattern to do so. All tensorflow depdendencies are installed into global python site-packages. Then virtual \nenvironments are created for both cpu and gpu versions and the appropriate version of tensorflow is install into \nthe respective virtual environments.\n\nThe `run-image` script makes use of NVIDIA Docker 2.0 being installed on the host os. When run with the `-g` option,\nthe NVIDIA runtime will be used to make GPUs available in container.\n\nUpon container startup, the appropriate virtual environment (cpu or gpu) will be activated dependant upon the \n`-g` option.\n\nTo switch between virtual envrionments utilized the symbolic links, `/cpu-env` and `/gpu-env`, e.g. \n`source /cpu-env`.\n\n### Versioneer support\nIf you aren't using [versioneer](https://github.com/warner/python-versioneer) to version your Python projects, you \nshould be. Versioneer utilizes .git to determine the project version. Having correct version information in container \nis desireable in many cases, but pushing .git into container usually isn't desireable. To capture version information\nfor container, the `genversion` utility is available and uses capabilities of versioneer to generate a _version.py.bld\nfile in the project root. This file is available for `Dockerfile` to add/overwrite the version.py file within the \nDocker image. An example of this is found in the cicd sub-directory.\n\n### `.dockerignore`\nIn order to minimize the context sent to Docker to build images, please see examples in `.dockerignore` in this\nrepository.\n\n## A Note on Implementation\nWe selected to use the Docker command line from python scripts rather than the [Docker\nAPI available to Python](https://pypi.python.org/pypi/docker/) as it integrates better into my development loop. As each CLI prints \nthe Docker command it's using, if it does something unexpected, it's each to copy and paste\nthe command used, modify it and be on your way without having to debug through CLI utility code, \nallowing bugs/additions to the CLI to be addressed at a later point outside the context of a\nproject development loop.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/resero-labs/docker-utils.git", "keywords": "", "license": "MIT License", "maintainer": "", "maintainer_email": "", "name": "dockerutils", "package_url": "https://pypi.org/project/dockerutils/", "platform": "", "project_url": "https://pypi.org/project/dockerutils/", "project_urls": { "Homepage": "https://github.com/resero-labs/docker-utils.git" }, "release_url": "https://pypi.org/project/dockerutils/2.0.6/", "requires_dist": [ "awscli", "boto3", "future", "ConfigParser ; python_version <= \"2.7\"", "wheel (>=0.29) ; extra == 'dev'", "pytest (>=3.0) ; extra == 'test'", "pytest-cov (>=2.4) ; extra == 'test'", "pylint (>=1.8.1) ; extra == 'test'" ], "requires_python": "", "summary": "Docker Utilities/Patterns for Python Projects", "version": "2.0.6" }, "last_serial": 5874677, "releases": { "0.9.10": [ { "comment_text": "", "digests": { "md5": "06ca2d175a8676c8c9a977e6d74f21c5", "sha256": "94962c9a1d99d2b5c49cd424ee26fdaa3b5ffdd7bd53801da9a0967805f201d6" }, "downloads": -1, "filename": "dockerutils-0.9.10-py3-none-any.whl", "has_sig": false, "md5_digest": "06ca2d175a8676c8c9a977e6d74f21c5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 17874, "upload_time": "2018-04-19T19:25:21", "url": "https://files.pythonhosted.org/packages/85/1b/03d1b340bb8f971e4f1df92e9aacd389c7607d7996cc79d54839065591b8/dockerutils-0.9.10-py3-none-any.whl" } ], "0.9.11": [ { "comment_text": "", "digests": { "md5": "612172d6e83dcdc9e4bb2e14c884f86d", "sha256": "e04b813b9f91cd6e89a8d8ef458a992bff11b897c1df8045cdd6f87562a0e064" }, "downloads": -1, "filename": "dockerutils-0.9.11-py3-none-any.whl", "has_sig": false, "md5_digest": "612172d6e83dcdc9e4bb2e14c884f86d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 17880, "upload_time": "2018-04-20T20:01:04", "url": "https://files.pythonhosted.org/packages/71/72/f4c39974be0381f3e802b75691c47f01ab7c49ae9ddbd2accb7c48b53d1d/dockerutils-0.9.11-py3-none-any.whl" } ], "0.9.12": [ { "comment_text": "", "digests": { "md5": "8c5c9b37c0cd1f84c13cbc9ca8dff892", "sha256": "7a7504e27a6f717ec5938184314441908ebb60165525f3a62692348174ac7733" }, "downloads": -1, "filename": "dockerutils-0.9.12-py3-none-any.whl", "has_sig": false, "md5_digest": "8c5c9b37c0cd1f84c13cbc9ca8dff892", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 18090, "upload_time": "2018-04-25T16:28:55", "url": "https://files.pythonhosted.org/packages/ed/1e/e3873ef3bc47d39c6d269105660b4370982f4f46692a3f7c01916da28bfe/dockerutils-0.9.12-py3-none-any.whl" } ], "0.9.13": [ { "comment_text": "", "digests": { "md5": "3372fb7ab8ec9aac7ad7c65ed50c5d60", "sha256": "f5a61381ac3825482e2863dbc24ee93b98a01e64c1b178856daaaeb81570ae73" }, "downloads": -1, "filename": "dockerutils-0.9.13-py3-none-any.whl", "has_sig": false, "md5_digest": "3372fb7ab8ec9aac7ad7c65ed50c5d60", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 14308, "upload_time": "2018-07-06T02:59:30", "url": "https://files.pythonhosted.org/packages/69/e8/478a373f447eb575812e190d2b30a433f85497063486e90531e5c849dfb5/dockerutils-0.9.13-py3-none-any.whl" } ], "0.9.14": [ { "comment_text": "", "digests": { "md5": "18a0e854bee0a6072e0f3f019d8c8882", "sha256": "110245a815262351d554acff27d0b9c66534d068d34c12e5649bc7c699302422" }, "downloads": -1, "filename": "dockerutils-0.9.14-py3-none-any.whl", "has_sig": false, "md5_digest": "18a0e854bee0a6072e0f3f019d8c8882", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 14538, "upload_time": "2018-07-06T16:51:12", "url": "https://files.pythonhosted.org/packages/7f/00/be5d271b9dcd54e4c44afd6535fe4d1886a009024249d1fa0d69ed021d49/dockerutils-0.9.14-py3-none-any.whl" } ], "0.9.15": [ { "comment_text": "", "digests": { "md5": "aeb52cfd90b76f6e9eb275236498b28e", "sha256": "06188cab982c3ad4aeb0267dcea9763aefa0d3cd363ede9d9ff874ddd846c900" }, "downloads": -1, "filename": "dockerutils-0.9.15-py3-none-any.whl", "has_sig": false, "md5_digest": "aeb52cfd90b76f6e9eb275236498b28e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 15487, "upload_time": "2018-07-28T02:55:26", "url": "https://files.pythonhosted.org/packages/5c/36/bd9c69f6f5132bd5dab21b7fcc6e7baee985833f90eb30143ea08f70778b/dockerutils-0.9.15-py3-none-any.whl" } ], "0.9.3": [ { "comment_text": "", "digests": { "md5": "43e10afaa5ea20bea76f360d6dd130ff", "sha256": "5cc79377a6f5f6f67e06ebbf3caeeb9c43aee3887e24eac5d6db5e3c06b80bd8" }, "downloads": -1, "filename": "dockerutils-0.9.3.tar.gz", "has_sig": false, "md5_digest": "43e10afaa5ea20bea76f360d6dd130ff", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 25598, "upload_time": "2017-12-19T06:18:48", "url": "https://files.pythonhosted.org/packages/94/88/3bebff83adb070d24df7f764110a5ed5f81b270787c385edf8c42b574942/dockerutils-0.9.3.tar.gz" } ], "0.9.5": [ { "comment_text": "", "digests": { "md5": "a7513ad3411ae6e47cbb5329f27ac8a9", "sha256": "8a19de62652217a0084fe709d014ee405195a93d36e5b822f6532af34af1163a" }, "downloads": -1, "filename": "dockerutils-0.9.5-py3-none-any.whl", "has_sig": false, "md5_digest": "a7513ad3411ae6e47cbb5329f27ac8a9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 17688, "upload_time": "2018-02-08T17:46:48", "url": "https://files.pythonhosted.org/packages/0f/19/709e713bc35002d9b396b304ddbe8298e30add2d93e7463ed34652427ad0/dockerutils-0.9.5-py3-none-any.whl" } ], "0.9.7": [ { "comment_text": "", "digests": { "md5": "9fc230e6210bdcbf1e1d6ca47be85220", "sha256": "1f35d33e9c1010ca56fd5336656a7bd2e6288eef63b7302cc1b76f443a33cbdc" }, "downloads": -1, "filename": "dockerutils-0.9.7-py3-none-any.whl", "has_sig": false, "md5_digest": "9fc230e6210bdcbf1e1d6ca47be85220", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 17690, "upload_time": "2018-03-13T01:28:11", "url": "https://files.pythonhosted.org/packages/f0/00/de9badc369630f578c273d57c91186a05eb38dbdccac196de9f18de64f29/dockerutils-0.9.7-py3-none-any.whl" } ], "0.9.8": [ { "comment_text": "", "digests": { "md5": "d9d74076d889f03c8eac79db6f64eab3", "sha256": "c4bef6da8dd94ad5848eaf19eb05da9d4f017a1f8d0c45b0e56d81432bc2e932" }, "downloads": -1, "filename": "dockerutils-0.9.8-py3-none-any.whl", "has_sig": false, "md5_digest": "d9d74076d889f03c8eac79db6f64eab3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 17780, "upload_time": "2018-04-05T16:53:27", "url": "https://files.pythonhosted.org/packages/8a/37/ba08a248482a30ead1810efedf1c7fcb9a58d579043f3a921b72cf2deec2/dockerutils-0.9.8-py3-none-any.whl" } ], "0.9.9": [ { "comment_text": "", "digests": { "md5": "5c30a495aeb9189f893487cba0cdaed2", "sha256": "a231bb6069ead28236ace50ab4d0071640edf0d1bda91e6e1e337234dbd6d2ab" }, "downloads": -1, "filename": "dockerutils-0.9.9-py3-none-any.whl", "has_sig": false, "md5_digest": "5c30a495aeb9189f893487cba0cdaed2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 17790, "upload_time": "2018-04-19T15:01:05", "url": "https://files.pythonhosted.org/packages/31/6e/7b8c8b07ec3eadf243f941ccc64fee3fc5d69a196b44535fb8951be567c7/dockerutils-0.9.9-py3-none-any.whl" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "3bf0892206d50b4802e31eef41833740", "sha256": "f0814043fb464fefd1e3c28d84196c7d6dfe0d51b3c94b18436757123c6f836d" }, "downloads": -1, "filename": "dockerutils-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "3bf0892206d50b4802e31eef41833740", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 15399, "upload_time": "2018-07-28T14:18:13", "url": "https://files.pythonhosted.org/packages/47/f6/44023ef3126a8e43403eda98fcd128c524d43d9d20a6d53304691552596b/dockerutils-1.0.0-py3-none-any.whl" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "f7971b10e11aec38f58abc088a5e9c28", "sha256": "d9897d943ed78a09540e3413f560bd5f35c908b10d657abe3fbefa3d7e59f49c" }, "downloads": -1, "filename": "dockerutils-1.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "f7971b10e11aec38f58abc088a5e9c28", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 15664, "upload_time": "2018-08-01T21:53:38", "url": "https://files.pythonhosted.org/packages/b4/56/4ccfa231ab52d01013427ee3bb297cbba18e601ce1c2e4d75986a20466ed/dockerutils-1.0.1-py3-none-any.whl" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "64bcd3bf675b04ea15755aae780f5047", "sha256": "243fa94350613aff1b01f1838d4163a625974795ed65e60a66f1fb4c31813fa8" }, "downloads": -1, "filename": "dockerutils-1.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "64bcd3bf675b04ea15755aae780f5047", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 15663, "upload_time": "2018-08-25T13:16:11", "url": "https://files.pythonhosted.org/packages/28/6d/06fca7f8b1b4051d7b7a0b22a9bac340742406f8293dcd45ca70c74bb3f2/dockerutils-1.0.2-py3-none-any.whl" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "0035a99bc8cdd9e77662d69128f3fd0a", "sha256": "df843a424df80cc8352f3bd8d9f7b8e7bdccb148af8ec27bbeddac71266a3f83" }, "downloads": -1, "filename": "dockerutils-1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "0035a99bc8cdd9e77662d69128f3fd0a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 22906, "upload_time": "2018-09-10T21:30:25", "url": "https://files.pythonhosted.org/packages/4d/80/1e5ca7fa39f8ab6b8eedb6b48e89e3455873840d31a3766b7ebf3de4cb40/dockerutils-1.1-py3-none-any.whl" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "009ed3782213cd3779d5bf7f0aae45d3", "sha256": "a827eff469b11a7665dabea9462eaf6924b8e2b87ae79ad42fc86a0426fa476f" }, "downloads": -1, "filename": "dockerutils-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "009ed3782213cd3779d5bf7f0aae45d3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 23013, "upload_time": "2018-09-12T15:51:49", "url": "https://files.pythonhosted.org/packages/52/24/9427a3f876de2e6c628a197e3f964f55f6d08a0e46046a64e4349361864e/dockerutils-1.1.1-py3-none-any.whl" } ], "1.1.10": [ { "comment_text": "", "digests": { "md5": "0e461a6dd1d4e19ee7fcb353fbbf7dd2", "sha256": "d0ad748b16db0c0b1f175897695dfa5efef745c8332b7cfaeacb210b380e58ea" }, "downloads": -1, "filename": "dockerutils-1.1.10-py3-none-any.whl", "has_sig": false, "md5_digest": "0e461a6dd1d4e19ee7fcb353fbbf7dd2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 29281, "upload_time": "2018-12-10T20:12:00", "url": "https://files.pythonhosted.org/packages/c2/e9/04c1a18d74cf0c57489ed659980ca802384ae5eb57a8a5753e534f7c4bef/dockerutils-1.1.10-py3-none-any.whl" } ], "1.1.11": [ { "comment_text": "", "digests": { "md5": "7ae89875726fdf03d9e6095497ca265a", "sha256": "53c1933041ea7f375ee41df3c112f56e2d38e223f2207165b1c07798daf1f191" }, "downloads": -1, "filename": "dockerutils-1.1.11-py3-none-any.whl", "has_sig": false, "md5_digest": "7ae89875726fdf03d9e6095497ca265a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 29294, "upload_time": "2018-12-12T23:44:01", "url": "https://files.pythonhosted.org/packages/65/24/f307061457453eb3e17d3ca375e52f06fb7851745d9986a0035fd3d95313/dockerutils-1.1.11-py3-none-any.whl" } ], "1.1.12": [ { "comment_text": "", "digests": { "md5": "7390b43bf2b56197a12d454454fdfcfd", "sha256": "ae586be7747fce439c92f8df39f7a92f8041ee5783dc2ac0073f3d892d6ba8f2" }, "downloads": -1, "filename": "dockerutils-1.1.12-py3-none-any.whl", "has_sig": false, "md5_digest": "7390b43bf2b56197a12d454454fdfcfd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 29298, "upload_time": "2018-12-17T23:37:10", "url": "https://files.pythonhosted.org/packages/25/35/303b3cc03c640dbae7b4e70407a8fb366b791350eda303abb0eebd501bac/dockerutils-1.1.12-py3-none-any.whl" } ], "1.1.13": [ { "comment_text": "", "digests": { "md5": "9a49bbc642251f4b89c1b69dde3669fd", "sha256": "292b25eb37c3af8334d4dbf32b76f5ddbd5885299da0bda9c2a47ef7382686f1" }, "downloads": -1, "filename": "dockerutils-1.1.13-py3-none-any.whl", "has_sig": false, "md5_digest": "9a49bbc642251f4b89c1b69dde3669fd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 29313, "upload_time": "2018-12-21T11:35:45", "url": "https://files.pythonhosted.org/packages/99/cf/f9f7dfaa59e4eef92b47af39d7cd83dd737b4b745eddc83fb002c52335be/dockerutils-1.1.13-py3-none-any.whl" } ], "1.1.14": [ { "comment_text": "", "digests": { "md5": "bf1485c3dbbd626ba0cba25fc3d54acd", "sha256": "2ed2c1384922fb02eb1c905873c6d648863b02266b35e14666b423836ebfb8d9" }, "downloads": -1, "filename": "dockerutils-1.1.14-py3-none-any.whl", "has_sig": false, "md5_digest": "bf1485c3dbbd626ba0cba25fc3d54acd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 30231, "upload_time": "2019-01-16T22:24:21", "url": "https://files.pythonhosted.org/packages/e9/86/6ad553ddbde200b3e69a302c3c70bc1e2a4a0237d5d3923366bae1956076/dockerutils-1.1.14-py3-none-any.whl" } ], "1.1.15": [ { "comment_text": "", "digests": { "md5": "631e77efe2fe501c83693536b862d362", "sha256": "bf48138aeefda55b488f6e2f4d944ae1b77b8d1ea568dcaf31bd134b8342ae3d" }, "downloads": -1, "filename": "dockerutils-1.1.15-py3-none-any.whl", "has_sig": false, "md5_digest": "631e77efe2fe501c83693536b862d362", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 30457, "upload_time": "2019-01-22T15:44:50", "url": "https://files.pythonhosted.org/packages/af/63/fcbf48a934272dc319790067bad1d96bf9dec1751f8097a24be23fa65d98/dockerutils-1.1.15-py3-none-any.whl" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "d21063275fe30469961ed2d0edfd6b74", "sha256": "f2a8e84b5f020121bf6bd76187ae72790f7667c3f5fba9f152c5e249e681eef7" }, "downloads": -1, "filename": "dockerutils-1.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "d21063275fe30469961ed2d0edfd6b74", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 23280, "upload_time": "2018-09-13T20:51:19", "url": "https://files.pythonhosted.org/packages/46/04/3d14960c8290a3d1a84e3a649f00121a4d51742f9798d9a0a8dc6afe8d3a/dockerutils-1.1.2-py3-none-any.whl" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "f36b0301605d6fe6dabdeea8dda89069", "sha256": "5e4ee9db0db694b187e2778788ffdcb5e8dd73615e06454bc0aa333710a128a6" }, "downloads": -1, "filename": "dockerutils-1.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "f36b0301605d6fe6dabdeea8dda89069", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 23424, "upload_time": "2018-09-20T19:53:30", "url": "https://files.pythonhosted.org/packages/23/79/accd74ac1017b113562306b5d7c37281688e46b26a8bce0bbea4f4f77b14/dockerutils-1.1.3-py3-none-any.whl" } ], "1.1.4": [ { "comment_text": "", "digests": { "md5": "d47c4b4cc59195f60d955738324c8747", "sha256": "f35243613f98291d2c423f56e6b7e88ac2d800fb48c268caeb88f3fe46480aba" }, "downloads": -1, "filename": "dockerutils-1.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "d47c4b4cc59195f60d955738324c8747", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 23426, "upload_time": "2018-10-01T22:42:53", "url": "https://files.pythonhosted.org/packages/fa/91/37a02a03cdd5455e381564910cccd678384a5bc8e8833ea9be132721c1cd/dockerutils-1.1.4-py3-none-any.whl" } ], "1.1.5": [ { "comment_text": "", "digests": { "md5": "5678d958175669f38fb012d82048d0c7", "sha256": "3d41d2af97cdd047ae34ff99a11728d895e34d3d34ab7f40d2bc717001a4dacf" }, "downloads": -1, "filename": "dockerutils-1.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "5678d958175669f38fb012d82048d0c7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 24604, "upload_time": "2018-10-08T18:19:03", "url": "https://files.pythonhosted.org/packages/ca/e2/06eb0ca630f80f91a40a91fe94dce8894304d94857d748751da6fa0dc7af/dockerutils-1.1.5-py3-none-any.whl" } ], "1.1.6": [ { "comment_text": "", "digests": { "md5": "d9e2e98da886cfd02afe9d34e609442f", "sha256": "e89fa70b6f4fc3c3cc10d25d96b00cf71cc8b1ffa400dd7e1730ccfae6d1657e" }, "downloads": -1, "filename": "dockerutils-1.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "d9e2e98da886cfd02afe9d34e609442f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 27738, "upload_time": "2018-10-10T15:59:56", "url": "https://files.pythonhosted.org/packages/53/aa/17dca3b71d766ff257300e0be2a15be199584d65b2d3cf63ef7cc3d7634d/dockerutils-1.1.6-py3-none-any.whl" } ], "1.1.7": [ { "comment_text": "", "digests": { "md5": "20237a6fca36f190f43069032dc3e4a1", "sha256": "567a16685ba00e5705a7b7672b76ee47a492d4b52bab06304e8a89f5fcdb333d" }, "downloads": -1, "filename": "dockerutils-1.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "20237a6fca36f190f43069032dc3e4a1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 28483, "upload_time": "2018-10-15T21:44:43", "url": "https://files.pythonhosted.org/packages/96/bd/3bc9c195a391a988a410d07b50e61d7498e8d346dc1f7efa050712f41779/dockerutils-1.1.7-py3-none-any.whl" } ], "1.1.8": [ { "comment_text": "", "digests": { "md5": "b0903262aea037d7a31207e2aa9dacba", "sha256": "76463aa8e10165a0b00710b82134626248659469f0976445b75dbb816d40581b" }, "downloads": -1, "filename": "dockerutils-1.1.8-py3-none-any.whl", "has_sig": false, "md5_digest": "b0903262aea037d7a31207e2aa9dacba", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 28459, "upload_time": "2018-10-23T17:14:51", "url": "https://files.pythonhosted.org/packages/c7/60/0a0f817631e99712b46bc0d56dc56fd02886980049523a4856b6bc6155ee/dockerutils-1.1.8-py3-none-any.whl" } ], "1.1.9": [ { "comment_text": "", "digests": { "md5": "0d9efb08b7f6ee48519aabaa9497c09b", "sha256": "ae4e39a4eb30208a95c663a7dec21f85cb167dab019fb92c9cd46e29ebd33b01" }, "downloads": -1, "filename": "dockerutils-1.1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "0d9efb08b7f6ee48519aabaa9497c09b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 28721, "upload_time": "2018-12-03T22:30:31", "url": "https://files.pythonhosted.org/packages/9d/c1/11ef68253e001c6d765983e0b2d0d36939815b7e01d59de9040ca579e289/dockerutils-1.1.9-py3-none-any.whl" } ], "1.5.0": [ { "comment_text": "", "digests": { "md5": "efe69cba39adf8ccb613bfe49e56d8c0", "sha256": "b795d4dc5881577200702bdc1f69c46b164b1cd88afbccfa9ca8aac3b3ea518e" }, "downloads": -1, "filename": "dockerutils-1.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "efe69cba39adf8ccb613bfe49e56d8c0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31775, "upload_time": "2019-01-25T15:36:18", "url": "https://files.pythonhosted.org/packages/d2/20/8a8bf9f9d359de07f0f38aaf2864f5199f03cb00ee7592b13697efc15ea3/dockerutils-1.5.0-py3-none-any.whl" } ], "1.5.1": [ { "comment_text": "", "digests": { "md5": "934c096d8f6689bca3d626210b0bd62b", "sha256": "9485ad09c0473866c08e4496a1f3868e56c43b69e28c7832f6f09eb87db34b9c" }, "downloads": -1, "filename": "dockerutils-1.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "934c096d8f6689bca3d626210b0bd62b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31828, "upload_time": "2019-01-29T21:18:09", "url": "https://files.pythonhosted.org/packages/6e/f7/b26bc308e6bf6def0309c76b6ce4d89759cb2f16659a0a84f9e337dbfa27/dockerutils-1.5.1-py3-none-any.whl" } ], "1.5.2": [ { "comment_text": "", "digests": { "md5": "df1d9b97e2b4ac88aebcafd84532819b", "sha256": "7c84b853957f86cdc1a68f06a2260c4e1c191c9738635dd38629a08b4f47bfc2" }, "downloads": -1, "filename": "dockerutils-1.5.2-py3-none-any.whl", "has_sig": false, "md5_digest": "df1d9b97e2b4ac88aebcafd84532819b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31971, "upload_time": "2019-01-30T23:52:54", "url": "https://files.pythonhosted.org/packages/45/e4/c473a340faba560dbcb48bc4e0164f5d09c061c6e4af430b8700c9b73267/dockerutils-1.5.2-py3-none-any.whl" } ], "1.5.3": [ { "comment_text": "", "digests": { "md5": "3c32ec764c70b31e49de660c3354c2d7", "sha256": "27e68986992a117d5ece8a66bc18624b5c82fca858c3ec0bc64a6865ef6cb563" }, "downloads": -1, "filename": "dockerutils-1.5.3-py3-none-any.whl", "has_sig": false, "md5_digest": "3c32ec764c70b31e49de660c3354c2d7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32241, "upload_time": "2019-03-22T14:19:30", "url": "https://files.pythonhosted.org/packages/8c/a4/8c7eed9d104b4a1f3b2554ed15fd4424a18f756768d91117077cff1fa39d/dockerutils-1.5.3-py3-none-any.whl" } ], "1.5.4": [ { "comment_text": "", "digests": { "md5": "67e6bdf36900a1ff79cccba3f2497850", "sha256": "8e9df23c1ba5c81a19517c6b6be769ba838117e85a06bf1fbf2c0be29416a1ff" }, "downloads": -1, "filename": "dockerutils-1.5.4-py3-none-any.whl", "has_sig": false, "md5_digest": "67e6bdf36900a1ff79cccba3f2497850", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32251, "upload_time": "2019-04-03T23:20:36", "url": "https://files.pythonhosted.org/packages/f7/12/2984fb51a047fed6234a2f76a2fef6c7705dc01b04b3f2b823a2cc6c5b48/dockerutils-1.5.4-py3-none-any.whl" } ], "1.5.5": [ { "comment_text": "", "digests": { "md5": "3c008a237103366b33a3743d5c28a204", "sha256": "dd2c1fa93e76e9da4f288734fd15a90f1bc6d0362c38552bb98a46503dc6c0f8" }, "downloads": -1, "filename": "dockerutils-1.5.5-py3-none-any.whl", "has_sig": false, "md5_digest": "3c008a237103366b33a3743d5c28a204", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 33463, "upload_time": "2019-04-19T17:46:17", "url": "https://files.pythonhosted.org/packages/e8/6c/0ceb12a133c9920857470786a4a714a2a6ce57c31e816e4f24c7439a473e/dockerutils-1.5.5-py3-none-any.whl" } ], "1.5.6": [ { "comment_text": "", "digests": { "md5": "96d99f4d9b02d9dc9c1de0995d37202f", "sha256": "14309675262dc23125c2c0909d78942d00c93781f2415d57cf4233d87de551d9" }, "downloads": -1, "filename": "dockerutils-1.5.6-py3-none-any.whl", "has_sig": false, "md5_digest": "96d99f4d9b02d9dc9c1de0995d37202f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 33486, "upload_time": "2019-05-31T15:52:01", "url": "https://files.pythonhosted.org/packages/44/b9/92fc539fea05d0edf91ca0c8529d58a4c51d98ca8e1cc7d2200c71236aee/dockerutils-1.5.6-py3-none-any.whl" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "c779fd2998b496b98f91e364e9727eb2", "sha256": "40437acf05e6310416dbfd1f9235b2393b4616558e98bf86c99bb32bde9a8c72" }, "downloads": -1, "filename": "dockerutils-2.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c779fd2998b496b98f91e364e9727eb2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28489, "upload_time": "2019-08-02T20:46:25", "url": "https://files.pythonhosted.org/packages/8e/40/166e65199b1520b93a7c0a1f36d52a3de9038a2ee7f417fb6b4c5b7775c5/dockerutils-2.0.0-py3-none-any.whl" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "bf68521b1968fa9064b5eb806e65a93b", "sha256": "dbe323237a7f79c144ee506991058c9332669b33802d1a876baed6777eb42974" }, "downloads": -1, "filename": "dockerutils-2.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "bf68521b1968fa9064b5eb806e65a93b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28485, "upload_time": "2019-08-06T20:28:37", "url": "https://files.pythonhosted.org/packages/e9/27/f456dd8630e869b63889a631dd9676d101a40260d0331e604adbe6afcbd2/dockerutils-2.0.1-py3-none-any.whl" } ], "2.0.2": [ { "comment_text": "", "digests": { "md5": "1a9b8771d81832301908e4beb45be336", "sha256": "55336fd3342cda1fb90a998d974be5fe653ccba59aa5e9da6a905f34a42c86b9" }, "downloads": -1, "filename": "dockerutils-2.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "1a9b8771d81832301908e4beb45be336", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28523, "upload_time": "2019-08-06T22:19:56", "url": "https://files.pythonhosted.org/packages/80/03/dd1b449d2c5da0ddc326a1ce0904d3bd94d50d37245b10686dbb18f73905/dockerutils-2.0.2-py3-none-any.whl" } ], "2.0.3": [ { "comment_text": "", "digests": { "md5": "fdb8cf7f958beed77208f74930523216", "sha256": "5ead83c35fc59b4ccd7bcd1220488553be7e9b44fd915363928de15c909ed737" }, "downloads": -1, "filename": "dockerutils-2.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "fdb8cf7f958beed77208f74930523216", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29296, "upload_time": "2019-08-08T21:13:10", "url": "https://files.pythonhosted.org/packages/1f/55/350107ef264028eb9181ab114bb6ef649ebd5abd8ac1886976a09b11000d/dockerutils-2.0.3-py3-none-any.whl" } ], "2.0.4": [ { "comment_text": "", "digests": { "md5": "790829b0318c5f895932b9c34fc9a9e9", "sha256": "178b4792e017ce02cf3c56787b295677dc64a5e0de1ca15e36ad107be1644882" }, "downloads": -1, "filename": "dockerutils-2.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "790829b0318c5f895932b9c34fc9a9e9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29231, "upload_time": "2019-08-09T21:56:04", "url": "https://files.pythonhosted.org/packages/9c/99/3524f458df429dc2f8563d9227e06d977fac2519faef24395a4fd1307e03/dockerutils-2.0.4-py3-none-any.whl" } ], "2.0.5": [ { "comment_text": "", "digests": { "md5": "88b9b69a58b7106d9d3295eaaff305e2", "sha256": "2972cf1bcbcff2329d422b416de6749731a1625a573d97d2430ff63d87e42f17" }, "downloads": -1, "filename": "dockerutils-2.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "88b9b69a58b7106d9d3295eaaff305e2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29258, "upload_time": "2019-08-20T17:46:19", "url": "https://files.pythonhosted.org/packages/17/eb/f2f8c60c632ce4fb303065f04fd7e287af55c8b701e1abed46564bd12f89/dockerutils-2.0.5-py3-none-any.whl" } ], "2.0.6": [ { "comment_text": "", "digests": { "md5": "a68994b349689739b53c487e7cac06f7", "sha256": "eee176d4e523e8aad54d1ad354576b5bea24e1ca3670880870090b8ea600b8f4" }, "downloads": -1, "filename": "dockerutils-2.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "a68994b349689739b53c487e7cac06f7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31517, "upload_time": "2019-09-23T16:36:08", "url": "https://files.pythonhosted.org/packages/3b/34/e63ebccd89ea151507b0595cf7b13fff93f24779fb76907f413b86a5513b/dockerutils-2.0.6-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a68994b349689739b53c487e7cac06f7", "sha256": "eee176d4e523e8aad54d1ad354576b5bea24e1ca3670880870090b8ea600b8f4" }, "downloads": -1, "filename": "dockerutils-2.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "a68994b349689739b53c487e7cac06f7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31517, "upload_time": "2019-09-23T16:36:08", "url": "https://files.pythonhosted.org/packages/3b/34/e63ebccd89ea151507b0595cf7b13fff93f24779fb76907f413b86a5513b/dockerutils-2.0.6-py3-none-any.whl" } ] }