Run python functions on docker events
Python
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
src/docker_events
tests
LICENSE
README.rst
pytest.ini
setup.cfg
setup.py

README.rst

docker-events

objective

  • have a CLI to start a process which runs abitrary code on docker events
  • be able to provide a way to change behavior of and provide data to event subscribers
  • load subscribers by module or file
  • events may be extended

install

# pip install docker-events

usage

 # docker-events --help
 Usage: docker-events [OPTIONS]

 Options:
   -s, --sock TEXT        the docker socket
   -c, --config FILENAME  a config yaml
   -m, --module TEXT      a python module to load
   -f, --file PATH        a python file to load
   -l, --log PATH         logging config
   --debug                enable debug log level
   --help                 Show this message and exit.

 # create a config for skydns
 # cat > skydns-config.yaml << EOF
 ---

 skydns:
   domain: foo

 skydns.containers:
   redis:
     domain: myredis.{domain}
 EOF

# run skydns subscriber on start events
# docker-events -c skydns-config.yaml -m docker_events.tools.skydns

API

There are some predefined events: start, stop, create, die, destroy, pull

You may write your own events like this:

@event
def pull(client, event_data):
    return event_data.get('status') == 'pull'

Events may be extended by other events:

@docker_events.pull.extend
def pull_something(client, event_data):
    return event_data['id'].startswith("foobar")

For example if you want to use skydns, you may want to put the following code into a file or module and load it via -m or -f option:

"""
setup skydns records for containers
"""

import docker_events
import etcd
import simplejson as json


etcd_client = etcd.Client()


@docker_events.start.subscribe
def set_skydns_record(client, docker_event, config):
    # get ip of container
    container = client.inspect_container(docker_event['id'])

    container_name = container['Name'].strip("/")
    container_ip = container['NetworkSettings']['IPAddress']

    skydns_config = config.get('skydns', {})
    skydns_containers = config.get('skydns.containers', {
        'domain': 'docker.local'
    })

    # find domain name for this container
    if skydns_config and container_name in skydns_containers:
        # use template
        domain = skydns_containers[container_name].get('domain').format(**skydns_config)

    else:
        # join container_name with domain
        domain = '.'.join((container_name, skydns_config.get('domain')))

    domain_path = '/'.join(reversed(domain.split('.')))


    etcd_client.write('/skydns/local/skydns/{}'.format(domain_path), json.dumps({
        'host': container_ip
    }))