diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 871766129..000000000 --- a/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM praekeltfoundation/python-base -MAINTAINER Praekelt Foundation - -RUN pip install vumi diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 000000000..520c3a497 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,11 @@ +FROM praekeltfoundation/python-base +MAINTAINER Praekelt Foundation + +ENV VUMI_VERSION "0.6.2" +RUN pip install vumi==$VUMI_VERSION + +COPY ./vumi-entrypoint.sh /app/vumi-entrypoint.sh +WORKDIR /app + +ENTRYPOINT ["eval-args.sh", "dinit", "/app/vumi-entrypoint.sh"] +CMD [] diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 000000000..cfa6ba571 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,60 @@ +# Vumi Docker image +Documentation for Vumi is available online at http://vumi.readthedocs.org/ and in the `docs` directory of the repository. + +## Usage +The Docker image provides an entrypoint for Vumi that allows the configuration of Vumi workers via environment variables. + +### Environment variables +#### Basic options: +* `TWISTD_COMMAND`: the command to pass to `twistd` (default: `vumi_worker`) +* `WORKER_CLASS`: the Vumi worker class to use +* `CONFIG_FILE`: the path to the YAML configuration file to use +* `SENTRY_DSN`: the Sentry DSN to use for reporting errors + +#### AMQP options: +AMQP/RabbitMQ options can be set via environment variables. At a minimum, the `AMQP_HOST` variable must be set or else none of the other AMQP variables will take effect. +* `AMQP_HOST`: the address for the RabbitMQ server +* `AMQP_PORT`: the port for the RabbitMQ server (default: `5672`) +* `AMQP_VHOST`: the name of the RabbitMQ vhost to use (default: `/`) +* `AMQP_USERNAME`: the username to authenticate with RabbitMQ (default: `guest`) +* `AMQP_PASSWORD`: the password to authenticate with RabbitMQ (default: `guest`) + +#### `VUMI_OPT_` options +Additional options can be passed to Vumi via variables that start with `VUMI_OPT_`. These variables will be converted to `--set-option` CLI options. For example, the environment variable `VUMI_OPT_BUCKET=1` will result in the CLI option `--set-option=bucket:1`. + +### `/app` directory +The `/app` directory is created and set as the current working directory. This is the directory where the files (e.g. YAML config) for your application should be put. + +### Examples +Running a built-in worker class without a config file: +```shell +docker run --rm -it \ + -e WORKER_CLASS=vumi.blinkenlights.MetricTimeBucket \ + -e AMQP_HOST=rabbitmq.service.consul \ + -e VUMI_OPT_BUCKETS=3 \ + -e VUMI_OPT_BUCKET_SIZE=10 \ + praekeltfoundation/vumi +``` + +Dockerfile for an image with an external worker class and a config file: +```dockerfile +FROM praekeltfoundation/vumi +RUN pip install vumi-http-api +COPY ./my-config.yaml /app/my-config.yaml +ENV WORKER_CLASS="vumi_http_api.VumiApiWorker" \ + CONFIG_FILE="my-config.yaml" \ + AMQP_HOST="rabbitmq.service.consul" +EXPOSE 8000 +``` + +Dockerfile for an image with custom arguments: +```dockerfile +FROM praekeltfoundation/vumi +RUN pip install go-metrics-api +COPY ./my-config.yaml /app/my-config.yaml +ENV TWISTD_COMMAND="cyclone" +EXPOSE 8000 +CMD ["--app", "go_metrics.server.MetricsApi", \ + "--port", "8000", \ + "--app-opts", "my-config.yaml"] +``` diff --git a/docker/vumi-entrypoint.sh b/docker/vumi-entrypoint.sh new file mode 100755 index 000000000..e18f4fb2d --- /dev/null +++ b/docker/vumi-entrypoint.sh @@ -0,0 +1,38 @@ +#!/bin/bash -e + +TWISTD_COMMAND="${TWISTD_COMMAND:-vumi_worker}" + +WORKER_CLASS_OPT="" +if [ -n "$WORKER_CLASS" ]; then + WORKER_CLASS_OPT="--worker-class $WORKER_CLASS" +fi + +CONFIG_OPT="" +if [ -n "$CONFIG_FILE" ]; then + CONFIG_OPT="--config $CONFIG_FILE" +fi + +AMQP_OPTS="" +if [ -n "$AMQP_HOST" ]; then + AMQP_OPTS="--hostname $AMQP_HOST \ + --port ${AMQP_PORT:-5672} \ + --vhost ${AMQP_VHOST:-/} \ + --username ${AMQP_USERNAME:-guest} \ + --password ${AMQP_PASSWORD:-guest}" +fi + +SENTRY_OPT="" +if [ -n "$SENTRY_DSN" ]; then + SENTRY_OPT="--sentry $SENTRY_DSN" +fi + +SET_OPTS=$(env | grep ^VUMI_OPT_ | sed -e 's/^VUMI_OPT_//' -e 's/=/ /' | awk '{printf("%s=%s:%s ", "--set-option", tolower($1), $2);}') + +exec twistd --nodaemon \ + $TWISTD_COMMAND \ + $WORKER_CLASS_OPT \ + $CONFIG_OPT \ + $AMQP_OPTS \ + $SENTRY_OPT \ + $SET_OPTS \ + "$@"