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

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Docker Build Clone using Elixir

Build 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.2.0"}
  ]
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!() |>
  ExDockerBuild.DockerBuild.build(path)

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

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

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