diff --git a/.travis.yml b/.travis.yml index 7cd6ae159d..1436d099ae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,8 @@ matrix: env: TOXENV=py34 - python: 2.7 env: TOXENV=py27 + - stage: Verify Docker image builds + script: docker build -t locustio/locust . addons: apt: packages: diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..b99c8f14fb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,8 @@ +FROM python:3.6.6-alpine3.8 + +RUN apk --no-cache add g++ \ + && pip install locustio pyzmq + +EXPOSE 8089 5557 5558 + +ENTRYPOINT ["/usr/local/bin/locust"] diff --git a/docker_start.sh b/docker_start.sh new file mode 100644 index 0000000000..fba7bbe6ed --- /dev/null +++ b/docker_start.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +if [ -z "${TARGET_URL}" ]; then + echo "ERROR: TARGET_URL not configured" >&2 + exit 1 +fi + +LOCUST_MODE="${LOCUST_MODE:=standalone}" +LOCUST_OPTS="-f ${LOCUSTFILE_PATH:-/locustfile.py} -H ${TARGET_URL}" + +if [ "${LOCUST_MODE}" = "master" ]; then + LOCUST_OPTS="${LOCUST_OPTS} --master" +elif [ "${LOCUST_MODE}" = "slave" ]; then + if [ -z "${LOCUST_MASTER_HOST}" ]; then + echo "ERROR: MASTER_HOST is empty. Slave mode requires a master" >&2 + exit 1 + fi + + LOCUST_OPTS="${LOCUST_OPTS} --slave --master-host=${LOCUST_MASTER_HOST} --master-port=${LOCUST_MASTER_PORT:-5557}" +fi + +echo "Starting Locust..." +echo "$ locust ${LOCUST_OPTS}" + +locust ${LOCUST_OPTS} \ No newline at end of file diff --git a/docs/running-locust-distributed.rst b/docs/running-locust-distributed.rst index 4f2633e80d..d0cb704871 100644 --- a/docs/running-locust-distributed.rst +++ b/docs/running-locust-distributed.rst @@ -81,6 +81,12 @@ Used when starting the master node with ``--no-web``. The master node will then nodes has connected before the test is started. +Running distributed with Docker +============================================= + +See :ref:`running-locust-docker` + + Running Locust distributed without the web UI ============================================= diff --git a/docs/running-locust-docker.rst b/docs/running-locust-docker.rst new file mode 100644 index 0000000000..7841f1fddc --- /dev/null +++ b/docs/running-locust-docker.rst @@ -0,0 +1,43 @@ +.. _running-locust-docker: + +================================= +Running Locust with Docker +================================= + +To keep things simple we provide a single Docker image that can run standalone, as a master, or as a slave. + + +Environment Variables +--------------------------------------------- + +- ``LOCUST_MODE`` + +One of 'standalone', 'master', or 'slave'. Defaults to 'standalone'. + +- ``LOCUSTFILE_PATH`` + +The path inside the container to the locustfile. Defaults to '/locustfile.py` + +- ``LOCUST_MASTER_HOST`` + +The hostname of the master. + +- ``LOCUST_MASTER_PORT`` + +The port used to communicate with the master. Defaults to 5557. + + +Add your tests +--------------------------------------------- + +The easiest way to get your tests running is to build an image with your test file built in. Once you've +written your locustfile you can bake it into a Docker image with a simple ``Dockerfile``: + +``` +FROM locustio/locust +ADD locustfile.py locustfile.py +``` + +You'll need to push the built image to a Docker repository such as Dockerhub, AWS ECR, or GCR in order for +distributed infrastructure to be able to pull the image. See your chosen repository's documentation on how +to authenticate with the repository to pull the image. diff --git a/examples/docker-compose/docker-compose.yml b/examples/docker-compose/docker-compose.yml new file mode 100644 index 0000000000..e3de7b5b3c --- /dev/null +++ b/examples/docker-compose/docker-compose.yml @@ -0,0 +1,25 @@ +version: "3.4" + +x-common: &common + image: locustio/locust + environment: &common-env + TARGET_URL: http://locust-master:8089 + LOCUSTFILE_PATH: /tests/basic.py + volumes: + - ../:/tests + +services: + locust-master: + <<: *common + ports: + - 8089:8089 + environment: + <<: *common-env + LOCUST_MODE: master + + locust-slave: + <<: *common + environment: + <<: *common-env + LOCUST_MODE: slave + LOCUST_MASTER_HOST: locust-master \ No newline at end of file