Running a complete stack with docker-compose
To install FlexMeasures, plus the libraries and databases it depends on, on your computer is some work, and can have unexpected hurdles, e.g. depending on the operating system. A nice alternative is to let that happen within Docker. The whole stack can be run via Docker compose, saving the developer much time.
For this, we assume you are in the directory housing docker-compose.yml
.
Note
The minimum Docker version is 17.09 and for docker-compose we tested successfully at version 1.25. You can check your versions with docker[-compose] --version
.
Build the compose stack
Run this:
docker-compose build
This pulls the images you need, and re-builds the FlexMeasures one from code. If you change code, re-running this will re-build that image.
This compose script can also serve as an inspiration for using FlexMeasures in modern cloud environments (like Kubernetes). For instance, you might want to not build the FlexMeasures image from code, but simply pull the image from DockerHub.
Todo
This stack runs FlexMeasures, but misses the background worker aspect. For this, we’ll add a redis node and one additional FlexMeasures node, which runs a worker as entry point instead (see issue 418).
Run the compose stack
Start the stack like this:
docker-compose up
You can see log output in the terminal, but docker-compose logs
is also available to you.
Check docker ps
or docker-compose ps
to see if your containers are running:
± docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dda1a8606926 flexmeasures_server "bash -c 'flexmeasur…" 43 seconds ago Up 41 seconds (healthy) 0.0.0.0:5000->5000/tcp flexmeasures_server_1
27ed9eef1b04 postgres "docker-entrypoint.s…" 2 days ago Up 42 seconds 5432/tcp flexmeasures_dev-db_1
90df2065e08d postgres "docker-entrypoint.s…" 2 days ago Up 42 seconds 5432/tcp flexmeasures_test-db_1
The FlexMeasures container has a health check implemented, which is reflected in this output and you can see which ports are available on your machine to interact.
You can use docker-compose logs
to look at output. docker inspect <container>
and docker exec -it <container> bash
can be quite useful to dive into details.
Todo
We should provide a way to test that this is working, e.g. a list of steps. Document this, but also include that in our tsc/Release list (as a test step to see if Dockerization still works, plus a publish step for the released version).
Configuration
You can pass in your own configuration (e.g. for MapBox access token, or db URI, see below) like we described above for running a container: put a file flexmeasures.cfg
into a local folder called flexmeasures-instance
.
Data
The postgres database is a test database with toy data filled in when the flexmeasures container starts.
You could also connect it to some other database, by setting a different SQLALCHEMY_DATABASE_URI
in the config.
Running tests
You can run tests in the flexmeasures docker container, using the database service test-db
in the compose file (per default, we are using the dev-db
database service).
After you’ve started the compose stack with docker-compose up
, run:
docker exec -it -e SQLALCHEMY_TEST_DATABASE_URI="postgresql://fm-test-db-user:fm-test-db-pass@test-db:5432/fm-test-db" flexmeasures_server_1 pytest
This rounds up the dev experience offered by running FlexMeasures in Docker. Now you can develop FlexMeasures and also run your tests. If you develop plugins, you could extend the command being used, e.g. bash -c "cd /path/to/my/plugin && pytest"
.