Horatio helps you build a Docker image for the project you're working on and produces an artifact (JSON document) which contains meta-data about the image produced, this artifact than can be used in your build pipeline to do things like deploy containers with a configuration management tool / scheduler of your choice, Ansible for example.
Horatio's advantage is that it stays out of your way and let's you get on with building great software.
Horatio is most handy if you have an existing build pipeline and just want to try Docker containers out for your project with minimal fuss or have a lot of services to build, especially in different languages.
If, for example, you have a Java project which you build and manage with maven Horatio can parse a POM for you, strip the name and version and build and push a Docker container to a registry for you.
The automatic project detection is also good if you're nailing up several services in different languages, this helps automate building of Docker containers in a fast and simple manner, it's been used this way in the past.
Horatio automatically detects the kind of project you're working with and acts accordingly so far it supports:
- Maven
- Ruby Gems
- Node JS
If you use a Horatio document then Horatio will increment the version, commit and push it back the source repository for you. In all other cases Horatio will leave your existing version management alone.
This workflow is best if you just would like to build something like a Redis image.
If you just need to get an arbitrary project built and pushed somewhere you can simply create a horatio.json, like so:
To get started, Create a Horatio spec horatio.json
in your project root with the contents {'name': 'misc-project', 'version': '0.0.1'}
This workflow automatically increments the 'version' in the spec and pushes it back to your repository, this will be configurable soon
To install
$ gem install horatio
$ horatio
To prevent caching of a build, export the following environment variable before running horatio
DOCKER_BUILD_NO_CACHE=1
bundle install
guard
Unfortunately the Docker registry handles tags as mutable objects. If you push a image to the registry with the same name and version tag you will overwrite the previous tag. Inserting the revision from the latest git commit ensures we don't end up with collisions.
In honour of Horatio McAllister