Packages
A typed Elixir wrapper for the Docker CLI with struct-based commands and pipeline composition
Current section
Files
Jump to
Current section
Files
lib/docker/commands/compose/up.ex
defmodule Docker.Commands.Compose.Up do
@moduledoc """
Implements the `Docker.Command` behaviour for `docker compose up`.
## Examples
import Docker.Commands.Compose.Up
new()
|> file("docker-compose.yml")
|> detach()
|> build()
|> service("redis")
|> Docker.compose_up()
"""
@behaviour Docker.Command
import Docker.Command, only: [add_flag: 3, add_opt: 3, add_repeat: 3]
require Docker.Commands.Compose.Common
alias Docker.Commands.Compose.Common
defstruct Common.compose_fields(
services: [],
detach: false,
build_flag: false,
no_build: false,
force_recreate: false,
no_recreate: false,
no_start: false,
remove_orphans: false,
abort_on_container_exit: false,
always_recreate_deps: false,
wait: false,
timeout: nil,
scale: [],
pull: nil,
quiet_pull: false,
no_deps: false
)
@type t :: %__MODULE__{}
def new, do: %__MODULE__{}
def file(%__MODULE__{} = cmd, f), do: %{cmd | files: cmd.files ++ [f]}
def project_name(%__MODULE__{} = cmd, n), do: %{cmd | project_name: n}
def project_directory(%__MODULE__{} = cmd, d), do: %{cmd | project_directory: d}
def env_file(%__MODULE__{} = cmd, f), do: %{cmd | env_files: cmd.env_files ++ [f]}
def profile(%__MODULE__{} = cmd, p), do: %{cmd | profiles: cmd.profiles ++ [p]}
def service(%__MODULE__{} = cmd, s), do: %{cmd | services: cmd.services ++ [s]}
def detach(%__MODULE__{} = cmd), do: %{cmd | detach: true}
def build(%__MODULE__{} = cmd), do: %{cmd | build_flag: true}
def no_build(%__MODULE__{} = cmd), do: %{cmd | no_build: true}
def force_recreate(%__MODULE__{} = cmd), do: %{cmd | force_recreate: true}
def no_recreate(%__MODULE__{} = cmd), do: %{cmd | no_recreate: true}
def no_start(%__MODULE__{} = cmd), do: %{cmd | no_start: true}
def remove_orphans(%__MODULE__{} = cmd), do: %{cmd | remove_orphans: true}
def abort_on_container_exit(%__MODULE__{} = cmd), do: %{cmd | abort_on_container_exit: true}
def always_recreate_deps(%__MODULE__{} = cmd), do: %{cmd | always_recreate_deps: true}
def wait(%__MODULE__{} = cmd), do: %{cmd | wait: true}
def timeout(%__MODULE__{} = cmd, t), do: %{cmd | timeout: t}
def quiet_pull(%__MODULE__{} = cmd), do: %{cmd | quiet_pull: true}
def no_deps(%__MODULE__{} = cmd), do: %{cmd | no_deps: true}
def pull_policy(%__MODULE__{} = cmd, p), do: %{cmd | pull: p}
def scale(%__MODULE__{} = cmd, service, count) do
%{cmd | scale: cmd.scale ++ [{service, count}]}
end
@impl true
def args(%__MODULE__{} = cmd) do
Common.compose_prefix(cmd)
|> Kernel.++(["up"])
|> add_flag(cmd.detach, "-d")
|> add_flag(cmd.build_flag, "--build")
|> add_flag(cmd.no_build, "--no-build")
|> add_flag(cmd.force_recreate, "--force-recreate")
|> add_flag(cmd.no_recreate, "--no-recreate")
|> add_flag(cmd.no_start, "--no-start")
|> add_flag(cmd.remove_orphans, "--remove-orphans")
|> add_flag(cmd.abort_on_container_exit, "--abort-on-container-exit")
|> add_flag(cmd.always_recreate_deps, "--always-recreate-deps")
|> add_flag(cmd.wait, "--wait")
|> add_flag(cmd.quiet_pull, "--quiet-pull")
|> add_flag(cmd.no_deps, "--no-deps")
|> add_opt(cmd.timeout && to_string(cmd.timeout), "-t")
|> add_opt(cmd.pull, "--pull")
|> add_repeat(cmd.scale, fn {s, c} -> ["--scale", "#{s}=#{c}"] end)
|> Kernel.++(cmd.services)
end
@impl true
def parse_output(stdout, 0), do: {:ok, stdout}
def parse_output(stdout, exit_code), do: {:error, {stdout, exit_code}}
end