ex_docker_build
ex_docker_build copied to clipboard
docker build with support for bind mounts at build time via Docker Remote API
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.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
COPY
ing-
COPY ./relative/path/to/origin:/absolute/path/to/destination
-
- Doesn't support standard
VOLUMES
, it only supports the followingVOLUME
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 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