Skip to content

docker build with support for bind mounts at build time via Docker Remote API

License

Notifications You must be signed in to change notification settings

esl/ex_docker_build

Repository files navigation

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.2"}
  ]
end

Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/ex_docker_build.

Usage

Example 1 - Elixir Release with Distillery

Clone the following example in a directory you wish

$> mkdir ~/workspace
$> cd workspace
$> git clone https://github.com/sescobb27/elixir-docker-guide

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!() |>
  ExDockerBuild.DockerBuild.build(path)

Or you can start using escript:

mix escript.build
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!() |>
  ExDockerBuild.DockerBuild.build(path)

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 COPYing
    • COPY ./relative/path/to/origin:/absolute/path/to/destination
  • Doesn't support standard VOLUMES, it only supports the following VOLUMEs 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

About

docker build with support for bind mounts at build time via Docker Remote API

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages