Current section
Files
Jump to
Current section
Files
lib/docker/containers.ex
defmodule Docker.Containers do
@moduledoc false
alias Docker.WaitStrategy
def create(container_config, name \\ nil) do
Docker.Api.create_container(container_config, name)
end
def run(container_config, name \\ nil) do
case Docker.Api.create_container(container_config, name) do
{:ok, container_id} ->
start_and_wait(container_id, container_config)
{:error, {:http_error, 404}} ->
Docker.Images.pull(container_config.image)
run(container_config)
{:error, reason} ->
{:error, reason}
end
end
def start(container_id) do
Docker.Api.start_container(container_id)
end
def stop(container_id, options \\ []) do
Docker.Api.stop_container(container_id, options)
end
def info(container_id), do: Docker.Api.inspect_container(container_id)
def mapped_port(container, container_port) do
container_port =
container_port
|> set_protocol_to_tcp_if_not_specified
case info(container) do
{:ok, info} ->
info.mapped_ports
|> Map.get(container_port)
|> String.to_integer()
{:error, message} ->
{:error, message}
end
end
defp set_protocol_to_tcp_if_not_specified(port) when is_binary(port), do: port
defp set_protocol_to_tcp_if_not_specified(port) when is_integer(port), do: "#{port}/tcp"
defp start_and_wait(container_id, container_config) do
:ok = Docker.Containers.start(container_id)
if container_config.wait_strategy do
:ok = WaitStrategy.wait_until_container_is_ready(container_config.wait_strategy, container_id)
end
{:ok, container_id}
end
end