Advanced concepts
Docker
Every Workertown service can be run using a Docker image. This is useful for local development, or for running services in an offline environment.
The Docker images
Each service is hosted on DockerHub under the cloudmix organisation. The images are named after the service they provide as cloudmix/workertown-<service>, e.g. cloudmix/workertown-search.
Configuring a Docker image
Any available configuration options for a service can be passed to the Docker image via environment variables. The environment variables for configuration are prefixed with options_, and delimited by _ (underscore). They can be nested to the depth required.
Here are some examples:
options_basePath=...is equal to settingbasePathoptions_auth_apiKey_apiKey=...is equal to settingauth.apiKey.apiKeyoptions_cors_origin=...is equal to settingcors.origin
Values passed via the environment are parsed optimistically in this order:
- Parse it as a
number/float - Parse it as a
boolean - Parse it as a
Functionstring - Parse it as a
JSONstringified value - Leave it as a
string
Be careful with function options
Any available option that takes a function can be set within the environment as a string representing the function.
You can write either a named/anonymous function or an ES5 arrow function:
"function() { return { /* ... */ } }"
"() => { return { /*...*/ } }"
"() => ({ /*...*/ })"
Any functions parsed like this have access to a Workertown global object that contains all of the runtime adapters available for the service, e.g.:
"() => ({ storage: new Workertown.SqliteStorageAdapter() })"
Aditionally, all Docker images support a PORT environment variable to set the port the service will listen on (the default is 3000).
Persisting data
By default, each Docker image will persist data using the Sqlite storage adapter, so that data is persisted even when the container is stopped. By default, the Sqlite database file is saved to /usr/src/app/db.sqlite, but this can be configured by either changing the environment variable that env.db maps to, or by passing in a file path in a custom runtime function. If the file path does not end with .sqlite, then it will be ignored and the default path will be used.