This comes with support for Bind Mounts at Build Time
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.
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
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
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.
- Doesn't support relative paths in the container when
COPY
ingCOPY ./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
- add support for more docker file instructions
- resolve TODOs inside the source code