Skip to content

Commit

Permalink
Retry fetching mapped host port when a container is created
Browse files Browse the repository at this point in the history
  • Loading branch information
hexedpackets committed Jul 17, 2024
1 parent f47e636 commit bcf687a
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 10 deletions.
2 changes: 2 additions & 0 deletions lib/docker/container_state.ex
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ defmodule Docker.ContainerState do

defp host_port(nil), do: nil

defp host_port([]), do: nil

defp host_port(ports) do
ports
|> Enum.at(0)
Expand Down
27 changes: 17 additions & 10 deletions lib/docker/containers.ex
Original file line number Diff line number Diff line change
Expand Up @@ -30,22 +30,29 @@ defmodule Docker.Containers do

def info(container_id), do: Docker.Api.inspect_container(container_id)

def mapped_port(container, container_port) do
def mapped_port(container, container_port), do: mapped_port(container, container_port, 5)

def mapped_port(_container, _container_port, 0), do: {:error, :missing_port}

def mapped_port(container, container_port, retries) do
container_port =
container_port
|> set_protocol_to_tcp_if_not_specified

case info(container) do
{:ok, info} ->
port =
info.mapped_ports
|> Map.get(container_port)
|> String.to_integer()
with {:ok, info} <- info(container) do
port =
info.mapped_ports
|> Map.get(container_port)

{:ok, port}
case port do
nil ->
# Port mappings are not configured immediately after the container is creating. If the
# mapping is missing, sleeping and retrying is usually sufficient.
:timer.sleep(10)
mapped_port(container, container_port, retries - 1)

{:error, message} ->
{:error, message}
port -> {:ok, String.to_integer(port)}
end
end
end

Expand Down

0 comments on commit bcf687a

Please sign in to comment.