Current section
Files
Jump to
Current section
Files
lib/api/docker_remote_api.ex
defmodule ExDockerBuild.API.DockerRemoteAPI do
alias ExDockerBuild.API.Docker
@behaviour Docker
@version "v1.37"
@endpoint URI.encode_www_form("/var/run/docker.sock")
@protocol "http+unix"
@url "#{@protocol}://#{@endpoint}/#{@version}"
@json_header {"Content-Type", "application/json"}
@tar_header {"Content-Type", "application/tar"}
@impl Docker
def commit(container_id, payload) do
"#{@url}/commit"
|> URI.parse()
|> Map.put(:query, URI.encode_query(%{"container" => container_id}))
|> URI.to_string()
|> HTTPoison.post(Poison.encode!(payload), [@json_header])
end
@impl Docker
def create_container(payload, params \\ %{}) do
name = Map.get(payload, "ContainerName", "")
params = if name != "", do: Map.merge(params, %{name: name}), else: params
"#{@url}/containers/create"
|> URI.parse()
|> Map.put(:query, URI.encode_query(params))
|> URI.to_string()
|> HTTPoison.post(Poison.encode!(payload), [@json_header])
end
@impl Docker
def remove_container(container_id, params \\ %{}) do
"#{@url}/containers/#{container_id}"
|> URI.parse()
|> Map.put(:query, URI.encode_query(params))
|> URI.to_string()
|> HTTPoison.delete()
end
@impl Docker
def start_container(container_id) do
HTTPoison.post("#{@url}/containers/#{container_id}/start", "", [])
end
@impl Docker
def stop_container(container_id) do
"#{@url}/containers/#{container_id}/stop"
|> URI.parse()
|> Map.put(:query, URI.encode_query(%{t: 5}))
|> URI.to_string()
|> HTTPoison.post("", [], timeout: 30_000, recv_timeout: 30_000)
end
@impl Docker
def wait_container(container_id, timeout \\ :infinity) do
HTTPoison.post("#{@url}/containers/#{container_id}/wait", "", [],
timeout: timeout,
recv_timeout: timeout
)
end
@impl Docker
def upload_file(container_id, archive_payload, output_path) do
query_params =
URI.encode_query(%{
"path" => output_path,
"noOverwriteDirNonDir" => false
})
"#{@url}/containers/#{container_id}/archive"
|> URI.parse()
|> Map.put(:query, query_params)
|> URI.to_string()
|> HTTPoison.put(archive_payload, [@tar_header])
end
@impl Docker
def pull(image) do
# TODO: ADD support for X-Registry-Auth
"#{@url}/images/create"
|> URI.parse()
|> Map.put(:query, URI.encode_query(%{"fromImage" => image}))
|> URI.to_string()
|> HTTPoison.post("", [], timeout: :infinity, recv_timeout: :infinity)
end
@impl Docker
def create_volume(payload) do
HTTPoison.post("#{@url}/volumes/create", Poison.encode!(payload), [@json_header])
end
end