Packages
dagger
0.11.4
0.21.7
0.21.6
0.21.5
0.21.4
0.21.3
0.21.2
0.21.1
0.21.0
0.20.8
0.20.7
0.20.6
0.20.5
0.20.4
0.20.3
0.20.2
0.20.1
0.20.0
0.19.11
0.19.10
0.19.9
0.19.8
0.19.7
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.19
0.18.18
0.18.17
0.18.16
0.18.15
0.18.14
0.18.13
0.18.12
0.18.11
0.18.10
0.18.9
0.18.8
0.18.7
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.2
0.17.1
0.17.0
0.16.3
0.16.2
0.16.1
0.16.0
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.0
0.13.7
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.7
0.12.6
0.12.5
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.9
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.2
0.0.0
retired
Dagger SDK for Elixir
Current section
Files
Jump to
Current section
Files
lib/dagger.ex
defmodule Dagger do
@moduledoc """
The [Dagger](https://dagger.io/) SDK for Elixir.
## Prerequisite
The SDK depends on `docker` and `dagger` commands, please make sure those
commands are presents on your `PATH`.
## Getting Started
Let's try this script below
Mix.install([:dagger])
# 1
Application.ensure_all_started(:inets)
# 2
{:ok, client} = Dagger.connect()
# 3
{:ok, output} =
client
|> Dagger.Client.container()
|> Dagger.Container.from("hexpm/elixir:1.14.4-erlang-25.3-debian-buster-20230227-slim")
|> Dagger.Container.with_exec(["elixir", "--version"])
|> Dagger.Container.stdout()
IO.puts(output)
# 4
Dagger.close(client)
Here's what script do:
1. Start `:inets` application in order to use `:httpc` as a HTTP client.
2. Connecting to the Dagger Engine with `Dagger.connect/1`.
3. Create a new container from `hexpm/elixir:1.14.4-erlang-25.3-debian-buster-20230227-slim`
and calling a command `elixir` with flag `--version`, get the standard
output from latest command and printing it to standard output.
4. Close the connection.
"""
@doc """
Connecting to Dagger.
When calling this function, it try to connect in ordered:
1. Use session from `DAGGER_SESSION_PORT` and `DAGGER_SESSION_TOKEN` shell
environment variables.
2. If (1) doesn't specified, it will lookup a binary defined in `_EXPERIMENTAL_DAGGER_CLI_BIN`
and start a session.
3. Download the latest binary from Dagger and start a session.
## Options
#{NimbleOptions.docs(Dagger.Core.Client.connect_schema())}
"""
def connect(opts \\ []) do
with {:ok, graphql_client} <- Dagger.Core.Client.connect(opts) do
client = %Dagger.Client{
client: graphql_client,
selection: Dagger.Core.QueryBuilder.Selection.query()
}
case Dagger.Client.check_version_compatibility(
client,
Dagger.Core.EngineConn.engine_version()
) do
{:error, reason} -> IO.warn("failed to check version compatibility: #{inspect(reason)}")
_ -> nil
end
{:ok, client}
end
end
@doc """
Similar to `connect/1` but raise exception when found an error.
"""
def connect!(opts \\ []) do
case connect(opts) do
{:ok, query} -> query
error -> raise "Cannot connect to Dagger engine, cause: #{inspect(error)}"
end
end
@doc """
Disconnecting the client from Dagger Engine session.
"""
def close(%Dagger.Client{client: client}) do
Dagger.Core.Client.close(client)
end
end