{ "info": { "author": "Frank Sachsenheim", "author_email": "funkyfuture@riseup.net", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: System Administrators", "License :: OSI Approved :: ISC License (ISCL)", "Natural Language :: English", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython" ], "description": "deck-chores\n===========\n\n.. image:: https://img.shields.io/docker/pulls/funkyfuture/deck-chores.svg\n :target: https://hub.docker.com/r/funkyfuture/deck-chores/\n\n.. image:: https://images.microbadger.com/badges/image/funkyfuture/deck-chores.svg\n :target: https://microbadger.com/images/funkyfuture/deck-chores\n\n.. image:: https://img.shields.io/pypi/v/deck-chores.svg\n :target: https://pypi.org/project/deck-chores/\n\n**A job scheduler for Docker containers, configured via container labels.**\n\n* Documentation: https://deck-chores.readthedocs.io\n* Image repository: https://hub.docker.com/r/funkyfuture/deck-chores\n* Code repository: https://github.com/funkyfuture/deck-chores\n* Issue tracker: https://github.com/funkyfuture/deck-chores/issues\n* Free software: ISC license\n\n\nFeatures\n--------\n\n- define regular jobs to run within a container context with container and optionally with image\n labels\n- use date, interval and cron-like triggers\n- set a maximum of simultaneously running instances per job\n- restrict job scheduling to one container per service\n- multi-architecture image supports ``amd64`` and ``armv7l`` platforms, no emulator involved\n\n\nExample\n-------\n\nLet's say you want to dump the database of a Wordpress once a day. Here's a ``docker-compose.yml``\nthat defines a job that will be handled by *deck-chores*:\n\n.. code-block:: yaml\n\n version: '2'\n\n services:\n wordpress:\n image: wordpress\n mysql:\n image: mariadb\n volumes:\n - ./database_dumps:/dumps\n labels:\n deck-chores.dump.command: sh -c \"mysqldump --all-databases > /dumps/dump-$$(date -Idate)\"\n deck-chores.dump.interval: daily\n\nIt is however recommended to use scripts with a proper shebang for such actions. Their outputs to\n``stdout`` and ``stderr`` as well as their exit code will be logged by *deck-chores*.\n\n\nLimitations\n-----------\n\nAt the moment *deck-chores* is designed to run on a single Docker node, not\nwithin a cluster of these. Code and documentation contribution covering this\nare highly encouraged.\n\n\nAcknowledgements\n----------------\n\nIt wouldn't be as charming to write this piece of software without these projects:\n\n* `APScheduler `_ for managing jobs\n* `cerberus `_ for processing metadata\n* `docker-py `_ for Docker interaction\n* `flake8 `_, `mypy `_,\n `pytest `_ and `tox `_ for testing\n* `Python `_\n\n\nAuthors\n-------\n\n- Frank Sachsenheim (maintaining)\n- aeri4list\n- alpine-digger\n- Brynjar Sm\u00e1ri Bjarnason\n\n\nHistory\n-------\n\n0.3 (2019-01-06)\n~~~~~~~~~~~~~~~~\n\n* *fix*: log the version at startup, not its variable name\n\n0.3-rc1 (2018-12-18)\n~~~~~~~~~~~~~~~~~~~~\n\n* *new*: the container configuration ``options.user`` allows to set an executing user\n for all jobs that don't define one, can also be set on an image (:issue:`5`)\n* *new*: environment variables for a job can be set in a job's ``env`` namespace\n (:issue:`41`)\n* *new*: a job's ``workdir`` attribute can be used to set the working directory (:issue:`42`)\n* *new*: cron and interval triggers can be configured to delay randomly with the ``jitter``\n option (:issue:`43`)\n* *new*: interval triggers and the jitter option can be defined with strings containing\n time units\n* *removed*: the ``DEFAULT_USER`` environment variable is removed (:issue:`17`)\n* *removed*: parsing of environment variables ``ASSERT_FINGERPRINT`` and ``DOCKER_DAEMON``\n* *changed*: the container configuration ``options`` is moved to ``options.flags``\n* *changed*: the environment variable ``DEFAULT_OPTIONS`` is renamed to ``DEFAULT_FLAGS``\n* *changed*: upgraded base image\n* *changed*: upgraded used Cerberus version\n* *changed*: requires Python 3.7\n* *fix*: includes the ``tzdata`` package in the image (:issue:`33`)\n* *fix*: add jobs as paused for paused containers on startup\n* *refactoring*: uses the Python Docker SDK 3.5 (:issue:`31`)\n\n0.2 (2018-02-23)\n~~~~~~~~~~~~~~~~\n\n* *new*: documentation how to run scheduled jobs only (:issue:`25` by @binnisb)\n* *fix*: documentation on cron triggers (:issue:`27` by @alpine-digger)\n\n0.2-rc3 (2017-12-23)\n~~~~~~~~~~~~~~~~~~~~\n\n* *changed*: arm builds base on `python:3.6-alpine `_\n that are executed on an ARMv7l architecture\n* *changed*: Updated dependencies *APScheduler* and *docker-py*\n\n0.2-rc2 (2017-08-05)\n~~~~~~~~~~~~~~~~~~~~\n\n* *changed*: arm builds base on `arm32v6/python `_\n* *changed*: therefore ``arm32v6`` replaces the ``arm``-suffix in image tags\n* *changed*: there are no more images that get tagged with ``latest-$architecture``\n\n0.2-rc1 (2017-07-01)\n~~~~~~~~~~~~~~~~~~~~\n\n* *refactoring*: uses the Python Docker SDK 2 (:issue:`14`)\n* *removed*: ``ASSERT_FINGERPRINT`` environment variable\n* *renamed*: ``DOCKER_DAEMON`` to ``DOCKER_HOST`` to comply with the SDK\n* *fix*: check on fixed labels (:issue:`18` by @aeri4list)\n* documentation updates\n\n\n0.1 (2017-03-02)\n~~~~~~~~~~~~~~~~\n\n* *fix*: docker-py returns ``None`` for labels of images that were created with\n older Docker versions (:issue:`7`)\n\n0.1.beta3 (2017-01-22)\n~~~~~~~~~~~~~~~~~~~~~~\n\n* *new*: there's now a build for arm architectures\n* *new*: an architecture agnostic manifest is pushed to the image registry for\n release images\n\n0.1.beta2 (2016-12-08)\n~~~~~~~~~~~~~~~~~~~~~~\n\n* *new:* set log format per :envvar:LOG_FORMAT\n* *new:* an options label to set behavioural flags\n* *new:* containers can be identified as a service by configurable labels\n* *new:* job definitions for further containers of a service are ignored\n (default, opt-out can be configured)\n* *new:* image labels can also be parsed for job definitions\n (default, opt-out can be configured)\n\n0.1.beta1 (2016-12-04)\n~~~~~~~~~~~~~~~~~~~~~~\n\n* First release with full documentation\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/funkyfuture/deck-chores", "keywords": "docker", "license": "ISC license", "maintainer": "", "maintainer_email": "", "name": "deck-chores", "package_url": "https://pypi.org/project/deck-chores/", "platform": "", "project_url": "https://pypi.org/project/deck-chores/", "project_urls": { "Homepage": "https://github.com/funkyfuture/deck-chores" }, "release_url": "https://pypi.org/project/deck-chores/0.3/", "requires_dist": null, "requires_python": "", "summary": "Job scheduler for Docker containers, configured via container labels.", "version": "0.3" }, "last_serial": 4665840, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "2c12f6a7f4f3fe1067ba70eb26036cab", "sha256": "091351cf3b34cfe09a6546b38ee166e30bfd2eb8af4b69cd12ab531b811dc2e1" }, "downloads": -1, "filename": "deck_chores-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "2c12f6a7f4f3fe1067ba70eb26036cab", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 15177, "upload_time": "2017-03-02T22:25:01", "url": "https://files.pythonhosted.org/packages/ee/25/b7bf08c319e363e32491e20e23357b199a43c6d7b6f998818ca16e1ada11/deck_chores-0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ea5a8040acecf831f9de2cdd49ecac65", "sha256": "144459f977a76c77f0aedb49988bab1c1d49bb1919548d46a6c0ef247ca44288" }, "downloads": -1, "filename": "deck-chores-0.1.tar.gz", "has_sig": false, "md5_digest": "ea5a8040acecf831f9de2cdd49ecac65", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31875, "upload_time": "2017-03-02T22:24:57", "url": "https://files.pythonhosted.org/packages/74/2e/b62dd8fa8ee60997a3490696273b474244a1aca29ddf2e49639477695589/deck-chores-0.1.tar.gz" } ], "0.1b1": [ { "comment_text": "", "digests": { "md5": "c4d43a052e5d6e0be81725a1bdfd2527", "sha256": "57b45f7d6ca7a26c6d042cd08f748f3fff8a296bb68d76c08c31a09b66574f54" }, "downloads": -1, "filename": "deck-chores-0.1b1.tar.gz", "has_sig": false, "md5_digest": "c4d43a052e5d6e0be81725a1bdfd2527", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27803, "upload_time": "2016-12-04T20:44:33", "url": "https://files.pythonhosted.org/packages/a9/13/739505edf1b63e93957b875c5da9b975b84ea11a2b95e7f64893b7848787/deck-chores-0.1b1.tar.gz" } ], "0.1b2": [ { "comment_text": "", "digests": { "md5": "780aab7333d449c6a3842063e3081333", "sha256": "0f263716bafcdf9cf8590db2d87831991987632bec84f439f90ee6ea379838ab" }, "downloads": -1, "filename": "deck_chores-0.1b2-py3-none-any.whl", "has_sig": false, "md5_digest": "780aab7333d449c6a3842063e3081333", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 14435, "upload_time": "2016-12-08T22:20:51", "url": "https://files.pythonhosted.org/packages/e1/fc/9bbd8635b8e46ae99b27684e190b6d1df01a259131be8e28440ee2979847/deck_chores-0.1b2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1b619177d4b3755d755e045e83cce6b4", "sha256": "ed3684b9f64b98ce4887426aaa9783d237c8a4594ec6cd794e4128ce0df1fd86" }, "downloads": -1, "filename": "deck-chores-0.1b2.tar.gz", "has_sig": false, "md5_digest": "1b619177d4b3755d755e045e83cce6b4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31628, "upload_time": "2016-12-08T22:20:48", "url": "https://files.pythonhosted.org/packages/1f/6a/336c0444b5aeebacc6569594e5a1ba3b45e3dc5f83255491fe5ddc90cebb/deck-chores-0.1b2.tar.gz" } ], "0.1b3": [ { "comment_text": "", "digests": { "md5": "2bff566d6f6a039484e041f234c860d9", "sha256": "3032ce990de6de19a173db9bac1656a8e7a85d6ff210a1400b15587066cb80ef" }, "downloads": -1, "filename": "deck_chores-0.1b3-py3-none-any.whl", "has_sig": false, "md5_digest": "2bff566d6f6a039484e041f234c860d9", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 15117, "upload_time": "2017-01-23T00:49:04", "url": "https://files.pythonhosted.org/packages/a1/5f/e134f550aefa4c75a8a21bdc875201b7cda23d8e1190eaf344140a655f73/deck_chores-0.1b3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "156fb9cb8a7f75a482c4e230e55b6336", "sha256": "576670cbf81657cd7c8b5ab2fc5afaf8d62800339ce5ccbc4418a23821e1f24c" }, "downloads": -1, "filename": "deck-chores-0.1b3.tar.gz", "has_sig": false, "md5_digest": "156fb9cb8a7f75a482c4e230e55b6336", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31327, "upload_time": "2017-01-23T00:49:01", "url": "https://files.pythonhosted.org/packages/b4/e1/9ac336687e516001aea047a5a973eb305c9e2e02ddc33466af901d8fdc32/deck-chores-0.1b3.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "c79c469cd1c82627940f6dbfb5f4af67", "sha256": "e73a37cd13a74e52f42101365c428c5d0cf411d14a3b0bf7ac42db104d4f6710" }, "downloads": -1, "filename": "deck_chores-0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "c79c469cd1c82627940f6dbfb5f4af67", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 15721, "upload_time": "2018-01-22T23:19:32", "url": "https://files.pythonhosted.org/packages/5a/d7/4aec36af8156a4b80f398a71e4964be1fe88ac6bf26035e0d67dbf2ef8e4/deck_chores-0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "eeb13bd042128cd4eaf8cd82a075bba5", "sha256": "fe8ab4a50b29c56ec45975f418e8f9e5fb3d5f10aec7c76be2766df41e329e97" }, "downloads": -1, "filename": "deck-chores-0.2.tar.gz", "has_sig": false, "md5_digest": "eeb13bd042128cd4eaf8cd82a075bba5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32157, "upload_time": "2018-01-22T23:19:27", "url": "https://files.pythonhosted.org/packages/18/b4/a83e147d422ce48cac877adbd7a957571d81740f651f5edad6388f6691ff/deck-chores-0.2.tar.gz" } ], "0.2rc1": [ { "comment_text": "", "digests": { "md5": "da87998ce00c681d6be5577fbb1d4a48", "sha256": "33662d3fef3f9c8fed9e82711d7e33aa977d0a3e7e1c2afaadf3851f98473626" }, "downloads": -1, "filename": "deck_chores-0.2rc1-py3-none-any.whl", "has_sig": false, "md5_digest": "da87998ce00c681d6be5577fbb1d4a48", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 15088, "upload_time": "2017-07-01T19:32:57", "url": "https://files.pythonhosted.org/packages/10/f1/5eade7049ea9060f1ef32b42f1f89b735d401551d7855678e0076b639149/deck_chores-0.2rc1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "68f670af48e89d89016ef2e86b3e2706", "sha256": "0777f0b94a88bafb989faf12d6d7dcd03bdafb5373dbb66d1c510d44cb911e6c" }, "downloads": -1, "filename": "deck-chores-0.2rc1.tar.gz", "has_sig": false, "md5_digest": "68f670af48e89d89016ef2e86b3e2706", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31233, "upload_time": "2017-07-01T19:32:54", "url": "https://files.pythonhosted.org/packages/6c/4d/bcc3c78cf75bac97f541b02612c11419541a58d13aed334cb606a6005062/deck-chores-0.2rc1.tar.gz" } ], "0.2rc2": [ { "comment_text": "", "digests": { "md5": "8f8725f09e882b17189114daadc142ed", "sha256": "d5107a2c5743c67b15f05a4487841394eea2d0abb805f34c6405aeafbb9944c9" }, "downloads": -1, "filename": "deck_chores-0.2rc2-py3-none-any.whl", "has_sig": false, "md5_digest": "8f8725f09e882b17189114daadc142ed", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 15305, "upload_time": "2017-08-05T18:15:24", "url": "https://files.pythonhosted.org/packages/35/9b/b8363965f4f1a27f3eca580837932db85a60715b550367f76d8d27c3e37c/deck_chores-0.2rc2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "709a14d19e37287884c28cd2c87c8b82", "sha256": "6c4dc43fe322331cf96e909c1ed2c1c9d9ee868ed4fb7a64fb57839a3465d8ae" }, "downloads": -1, "filename": "deck-chores-0.2rc2.tar.gz", "has_sig": false, "md5_digest": "709a14d19e37287884c28cd2c87c8b82", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31520, "upload_time": "2017-08-05T18:15:21", "url": "https://files.pythonhosted.org/packages/c2/42/cbafd9ff6faa81cc5b4af693bd7319747e4dd0777c22bcf64f427ab8d807/deck-chores-0.2rc2.tar.gz" } ], "0.2rc3": [ { "comment_text": "", "digests": { "md5": "477265465743a2f0f86daff088c520e8", "sha256": "a9a02e749d9d3fccee093b0d6a5028aeba2f3c2ab9d0f3261fee0ea36d21de6e" }, "downloads": -1, "filename": "deck_chores-0.2rc3-py3-none-any.whl", "has_sig": false, "md5_digest": "477265465743a2f0f86daff088c520e8", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 15502, "upload_time": "2017-12-23T14:45:01", "url": "https://files.pythonhosted.org/packages/ef/60/cd4a037e54897cc68e6ce52dab6d124a8c2c6caee2d90ee2f6cbb9e364c7/deck_chores-0.2rc3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "240e2652ab0160a53bfe6146073d83d4", "sha256": "675bbdbfad7334052a690feba7cee54dfed824f65c266cba85144c0447b68178" }, "downloads": -1, "filename": "deck-chores-0.2rc3.tar.gz", "has_sig": false, "md5_digest": "240e2652ab0160a53bfe6146073d83d4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31707, "upload_time": "2017-12-23T14:44:58", "url": "https://files.pythonhosted.org/packages/6d/83/214d7d1cdbd69822efdc11a7f57676f0d325674c9d621a5694be88238b5a/deck-chores-0.2rc3.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "c6664278ca502eaaa2111dcecb3c6834", "sha256": "416fe1f8006c69d481f7b9b0155efc421ee2e8c6833cb0fa4baa40840b8cd91a" }, "downloads": -1, "filename": "deck_chores-0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "c6664278ca502eaaa2111dcecb3c6834", "packagetype": "bdist_wheel", "python_version": "3.7", "requires_python": null, "size": 14698, "upload_time": "2019-01-06T15:10:36", "url": "https://files.pythonhosted.org/packages/5f/6d/39e656a4948c81c3644e1549b32a3a668355259f4b91bff7db3c068bd802/deck_chores-0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aa9c5c472d16e052aedb3e2dbfbe4563", "sha256": "6bae357edbff1d2c4441a2b30559abb0430564c82bd51e9591d8efdfdc625b46" }, "downloads": -1, "filename": "deck-chores-0.3.tar.gz", "has_sig": false, "md5_digest": "aa9c5c472d16e052aedb3e2dbfbe4563", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36011, "upload_time": "2019-01-06T15:10:34", "url": "https://files.pythonhosted.org/packages/ec/33/ff51747710d80ea874089f27172e795e04070ab40e4bc096dde64603aa25/deck-chores-0.3.tar.gz" } ], "0.3rc1": [ { "comment_text": "", "digests": { "md5": "62798b95f63c566239dd6edb58284104", "sha256": "69a5b757d2e4756cd88de2c61e0b85ba3bdbdf012392614a13e55471baa05795" }, "downloads": -1, "filename": "deck_chores-0.3rc1-py3-none-any.whl", "has_sig": false, "md5_digest": "62798b95f63c566239dd6edb58284104", "packagetype": "bdist_wheel", "python_version": "3.7", "requires_python": null, "size": 14709, "upload_time": "2018-12-18T14:22:56", "url": "https://files.pythonhosted.org/packages/c5/f8/73232555ecf83cdf5ea9ab49af2b10d3025fce900972fd366caed1dc3d66/deck_chores-0.3rc1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "989467f660467a6ea9577dcd28064a82", "sha256": "313e8ca1c0082815fd9854013e3b7715a65026ca93d5d367f0e49d6d95644d33" }, "downloads": -1, "filename": "deck-chores-0.3rc1.tar.gz", "has_sig": false, "md5_digest": "989467f660467a6ea9577dcd28064a82", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35935, "upload_time": "2018-12-18T14:22:53", "url": "https://files.pythonhosted.org/packages/41/d1/669b74921ae456affa2ca8c30552ace12ee126d58405a2aa1e6ffc01f544/deck-chores-0.3rc1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c6664278ca502eaaa2111dcecb3c6834", "sha256": "416fe1f8006c69d481f7b9b0155efc421ee2e8c6833cb0fa4baa40840b8cd91a" }, "downloads": -1, "filename": "deck_chores-0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "c6664278ca502eaaa2111dcecb3c6834", "packagetype": "bdist_wheel", "python_version": "3.7", "requires_python": null, "size": 14698, "upload_time": "2019-01-06T15:10:36", "url": "https://files.pythonhosted.org/packages/5f/6d/39e656a4948c81c3644e1549b32a3a668355259f4b91bff7db3c068bd802/deck_chores-0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aa9c5c472d16e052aedb3e2dbfbe4563", "sha256": "6bae357edbff1d2c4441a2b30559abb0430564c82bd51e9591d8efdfdc625b46" }, "downloads": -1, "filename": "deck-chores-0.3.tar.gz", "has_sig": false, "md5_digest": "aa9c5c472d16e052aedb3e2dbfbe4563", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36011, "upload_time": "2019-01-06T15:10:34", "url": "https://files.pythonhosted.org/packages/ec/33/ff51747710d80ea874089f27172e795e04070ab40e4bc096dde64603aa25/deck-chores-0.3.tar.gz" } ] }