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 settingbasePath
options_auth_apiKey_apiKey=...
is equal to settingauth.apiKey.apiKey
options_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
Function
string - Parse it as a
JSON
stringified 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.