README.md

# DockerDistiller

This package uses Distillery and Docker to create containerized
builds of Elixir apps that are small and nimble.

In the past, this tool built all environments - however, we stepped away
from this. We currently only build one environment, `deploy`, hard-coded,
which is expected to be run with `REPLACE_OS_VARS` and thus use 12FA style
environment variable injection to make a different between staging, production,
and whatever else.

## Installation/Use

If [available in Hex](https://hex.pm/docs/publish), the package can be installed as:

  1. Add `docker_distiller` to your list of dependencies in `mix.exs`:

    ```elixir
    def deps do
      [{:docker_distiller, "~> 1.0"}]
    end
    ```

  1. Run `mix release.init` to get a Distillery config setup. See the [Distillery
     Docs](https://hexdocs.pm/distillery/getting-started.html) for details.

     Some changes in `rel/config.exs` you need to make:

     1. Set `default_environment` to `deploy` and include an `environment` stanza for that
     environment.

  1. Add a target `docker_repo` setting to your application in `mix.exs` - we will
     deploy to that repository.

     ```elixir
     def project do
       [app: :my_app,
        ...
        docker_repo: "quay.io/my_quay_repo",
        ...
       ]
     end
     ```

  1. (Optionally) override the build image. By default, we will use the `bitwalker/alpine-elixir`
     images for the correct elixir version, but you can override this in the project
     settings (in case you use a newer Elixir than published, or you can't use public
     Docker images for security reasons, etcetera):

     ```elixir
     def project do
       [...
        build_image: "super.repo.io/myrepo/elixir-dev:1.2.3"
        ...
       ]
     end
     ```

  1. (Optionally) use a local dockerfile as the build image.

     ```elixir
     def project do
       [...
        build_dockerfile: "path/to/your/Dockerfile"
        ...
       ]
     end
     ```

  1. (Optionally) use something else than `/opt/app` for the location where we unpack the app:

     ```elixir
     def project do
       [...
        path_in_container: "/"
        ...
       ]
     end
     ```

     (needs to end with a slash, by the way)

  1. Add a template Dockerfile called `Dockerfile.deploy.eex`. This template will get
     stuff injected from the build and then written as `Dockerfile`, overwriting
     existing things. The following is sent to the template:

     * `add_dist_tar`: Put an expansion for this in the Dockerfile at the location where
       you want the `ADD (tarball) (appname)` lines to land

    * `cmd_to_run`: The command to run for the built release

     An example minimal template:

     ```
     FROM bitwalker/alpine-elixir:1.5.2

     <%= add_dist_tar %>

     CMD <%= cmd_to_run %> foreground
     ```

     Note that even though the distribution tar contains Erlang, there are packages that
     Erlang needs (like the libncurses) so building from a basic Alpine image will most
     likely not work.

  1. Run `mix publish` to build a release and publish it.