# Docker Build Clone using Elixir

[![Build Status](](
[![Coverage Status](](

## What's the special thing about this?

This comes with support for **Bind Mounts at Build Time**

![Bind Mount at Build Time](

## Installation

If [available in Hex](, the package can be installed
by adding `ex_docker_build` to your list of dependencies in `mix.exs`:

def deps do
    {:ex_docker_build, "~> 0.6.1"}

Documentation can be generated with [ExDoc](
and published on [HexDocs]( Once published, the docs can
be found at [](

## Usage

### Example 1 - **Elixir Release with Distillery**

Clone the following example in a directory you wish

$> mkdir ~/workspace
$> cd workspace
$> git clone

Start a mix session with `iex -S mix` and type the following instructions

path = Path.expand("~/workspace/elixir-docker-guide")

{:ok, image_id} = Path.join([path, "Dockerfile"]) |>
  ExDockerBuild.DockerfileParser.parse_file!() |>

Or you can start using escript:

Generated escript ex_docker_build

Then call the escript passing the path to a Dockerfile

./ex_docker_build ~/workspace/elixir-docker-guide/Dockerfile

[info]  image created d44264c48dad

Copy the image_id into your clipboard and run the image with docker like this

docker run d44264c48dad # d44264c48dad being the image_id

### Example 2 - **Docker Build with Bind Mount**

in `test/fixtures/Dockerfile_bind.dockerfile` in line 2 `VOLUME /Users/kiro/test:/data`
change `/Users/kiro/test` with your path of preference e.g `/Your/User/test`
(must be an absolute path, relative paths aren't supported yet)

$> mkdir ~/test

path = Path.expand("./test/fixtures")

{:ok, image_id} = Path.join([path, "Dockerfile_bind.dockerfile"]) |>
  ExDockerBuild.DockerfileParser.parse_file!() |>

Then if you run `ls ~/test` you should see a file named `myfile.txt` with
`hello world!!!` as content

## Environment and debugging

This library respects the environmental variable `DOCKER_HOST` this can be
very helpful when debugging, for example:

In on terminal run `socat` :

socat -v UNIX-LISTEN:/tmp/fake,fork UNIX-CONNECT:/var/run/docker.sock

In the terminal where you are running `ex_docker_build` set the docker socket :

export DOCKER_HOST=unix:///tmp/fake

Now you can observe all interactions with the Docker API server.

## Limitations

- Doesn't support relative paths in the container when `COPY`ing
  - `COPY ./relative/path/to/origin:/absolute/path/to/destination`
- Doesn't support standard `VOLUMES`, it only supports the following `VOLUME`s type
  with custom syntax
  - [Bind Mounts]( e.g `VOLUME ~/path/to/host/dir:/path/to/container/dir`
  - [Named Volumes]( e.g `VOLUME volume_name` and then using it like `VOLUME volume_name:/path/to/container/dir`

## TODO:

- [ ] add support for more docker file instructions
- [ ] resolve TODOs inside the source code