This is an event dispatcher for file based docker inter-container communication. It enables docker containers to trigger actions in other containers by simply creating files.
The event emitting container ("emitter") and the event dispatcher container ("event-dispatcher") need to share a volume.
When the emitter creates a file inside this volume, the dispatcher gets triggered. It creates an event with an id
corresponding to the path of the created file and notifies all subscribed containers ("event handlers").
For example, if a file ${eventVolume}/some-dir/some-sub-dir/the-event-file
is created, all event handlers subscribed to
event some-dir.some-sub-dir.the-event-file
get notified.
The event-dispatcher removes every event file after successful dispatching.
Subscribing a container to an event is easy and can be done using container labels. A container is subscribed on
events with id ${eventId}
when it has a subscription.${eventId}
label.
The subscription usually defines a command, which will be executed inside the container using docker exec
. For further
details have a look at the Event Handler Configuration section.
A typical event dispatcher can be started as follows:
docker run \
-v $PWD/events:/app/events \
-v /var/run/docker.sock:/run/docker.sock \
qsrc/event-dispatcher
/app/events
: This volume is watched for events (files). Every event emitting container needs to write into this volume for emitting an event./run/docker.sock
: The event-dispatcher expects the host's docker socket being mounted on this volume. Otherwise, event handling containers can not be notified.
Event handling containers can be subscribed to events by specifying subscription.*
labels (the namespace can be
changed).
In the following example, docker exec event-handler touch handled
is called when the event demo.some-event
occurs:
docker run -ti --name event-handler -l subscription.demo.some-event.container.command=touch\ handled alpine sh
The following section describes all supported config labels (each label must be prefixed with
the corresponding label namespace ${namespace}
, see also
DISPATCHER_LABEL_NAMESPACE).
Specifies the command which shall be executed inside the event handler container when the event with id ${eventId}
occurs.
Space characters can me masked using \
.
If set to true
, the event handler container gets started if it is not running and an event with id ${eventId}
occurs.
If an event occurs very often, event handlers can instruct the dispatcher to debounce their notifications.
By setting this label to ${value}
, the event handler gets only notified, if the last event with id ${eventId}
occurred ${value}
milliseconds ago.
For example if you specify ${namesapce}.${eventId}.dispatching.debounce=1000
, the container will receive notifications
with a maximum delay of 1000ms. If an event with id ${eventId}
occurs 800ms after the last notification, it will be
dispatched to the container 200ms later if no other event with this id occurs. All occurrences in-between are ignored.
So only the last event during 1000ms since the last notification is dispatched.
The first event with id ${eventId}
since the event-dispatcher was started is always dispatched immediately.
The event-dispatcher can be configured using the following environment variables:
Specifies the label namespace. Every container label set on event handling containers needs to be prefixed with the value of this setting. See also Event Handler Configuration.
Every event detected by the event-dispatcher can be forwarded to any endpoint supported by Apache Camel. Multiple destinations are supported and must be separated by the delimiter character (see DISPATCHER_FORWARD_DELIMITER).
Specifies the delimiter character which separates multiple forwarding destinations specified in DISPATCHER_FORWARD_DESTINATION.
In order to contribute a patch, the workflow is as follows:
- Fork the repository
- Create a feature branch
- Commit patches
- Submit pull request
Please add unit tests for every feature added. In case of bugs, please add a unit test proving that the bug existed and is fixed.
In general commits should be atomic and diffs should be easy to read. For this reason do not mix any formatting fixes or code moves with actual code changes.
Commit messages should be verbose by default. They should be helpful to people reading your code in the future, so explain the reasoning for your decisions. Further explanation here.
This software is released under the MIT license.
Do you like this project and want to say thanks? Your donation is always welcome:
Bitcoin: 1LHq6uYsqMX23tx2hDripE4zktX6yxfrUF