The goal of this project is for people to stumble upon glorious and go:
You often want to run a project in different manners depending on certain criteria. What's an example? Imagine you have 20 services that you need to run in order to fully test a system, but you only need to actively work on one. Normally, you have to run all 20 services - which isn't fun.
What if you had container images for each of these? It sure would be nice to
run those instead of every project in dev mode. This is where glorious comes
in. With glorious you can have multiple slots, where glorious
will determine which slot to run depending on the provided criteria. This
leads to less load locally, saving your computer's resources.
Units are the top level components in glorious. A unit defines the what
of what we're trying to run (is it a server, redis node, etc). At the top level,
a unit will usually contain a name, a description and one or more slots.
Slots are how we run a unit. Each slot will have a provider, how we'll run
it, and a resolver which defines when we should run it. We'll check this out
in an example a little bit later.
With glorious, you can run code remotely via tunneling to a remote server or via the dockerd API.
glorious currently supports four provider types (plugins coming!):
bash/local: For running code locally.bash/remote: For running code remotely.docker/local: For running docker images locally.docker/remote: For running docker code remotely.
TB filled out (new images, code, etc)
// Remote app
unit "remote-app" {
name = "remote-app"
description = "example remote app"
slot "image-slot" {
provider {
type = "docker/remote"
image = "my-docker-hub/example-app:latest"
remote {
host = "tcp://dev.remote.box:2376"
}
}
resolver {
type = "keyword/value"
keyword = "services/app/remote/dev-mode"
value = "true"
}
}
slot "dev-slot" {
type = "bash/remote"
workingDir = "/home/user/code/app"
cmd = "npm run start"
remote {
workingDir = "/home/user/code/app"
host = "dev.remote.box"
user = "user"
identityFile = "~/.ssh/user-key.pem"
}
handler "rsync" {
type = "rsync/remote"
exclude = "node_modules"
}
handler "npm-install" {
type = "execute/remote"
match = ".*package(-lock)?.json$"
cmd = "npm install"
}
}
}
// Local app
unit "local-app" {
name = "local-app"
description = "example local app"
slot "dev-slot" {
provider {
type = "bash/local"
workingDir = "/home/user/code/app"
cmd = "npm run start"
}
resolver {
type = "default"
}
}
slot "image-slot" {
provider {
type = "docker/local"
image = "my-docker-hub/example-app:latest"
}
resolver {
type = "keyword/value"
keyword = "services/app/local/dev-mode"
value = "false"
}
}
}dockerd supports exposing the API remotely if the daemon is configured to do
so. If on a systemd based OS, you can do this by updating your
/etc/sysconfig/dockerd file by adding the following flags to the OPTIONS
var:
-H=unix:// -H=tcp://0.0.0.0:2376i.e.
OPTIONS="--default-ulimit nofile=1024:4096 -H=unix:// -H=tcp://0.0.0.0:2376"To enforce some degree of security, you should enforce firewall rules to only allow traffic to port 2376 from your IP address.
Once you have this configured, reload the config file and restart dockerd:
sudo systemctl daemon-reload
sudo systemctl restart docker.serviceFor more details, see Docker's notes here: https://success.docker.com/article/how-do-i-enable-the-remote-api-for-dockerd.
- documentation on configuring
dockerdfor remote API access -
.gloriousfile verification checks at boot up -
daemon for process status monitoring (?)- instead, each provider should be responsible for its own state tracking.
- ability to identify if remote processes and docker containers are still running
- support PID file based (bash) process state identification
- remote command execution (for "bash/remote" mode)
- file watching and remote synchronization
- remote dev mode constraints (initial setup, command hooks - i.e. npm
install after
package[-lock].jsonchanges) - debug log mode
- support volume mounting and envvar files for "docker/*" modes
