Docker Build Clone using Elixir
What's the special thing about this?
This comes with support for Bind Mounts 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"}
]
endDocumentation 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_buildThen call the escript passing the path to a Dockerfile
./ex_docker_build ~/workspace/elixir-docker-guide/Dockerfile
[info] image created d44264c48dadCopy the image_id into your clipboard and run the image with docker like this
docker run d44264c48dad # d44264c48dad being the image_idExample 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 ~/testpath = 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/fakeNow you can observe all interactions with the Docker API server.
Limitations
-
Doesn't support relative paths in the container when
COPYingCOPY ./relative/path/to/origin:/absolute/path/to/destination
-
Doesn't support standard
VOLUMES, it only supports the followingVOLUMEs type with custom syntax- Bind Mounts e.g
VOLUME ~/path/to/host/dir:/path/to/container/dir - Named Volumes e.g
VOLUME volume_nameand then using it likeVOLUME volume_name:/path/to/container/dir
- Bind Mounts e.g
TODO:
- add support for more docker file instructions
- resolve TODOs inside the source code