Packages
nerves
1.15.0
1.15.0
1.14.3
1.14.2
1.14.1
1.14.0
1.13.2
1.13.1
1.13.0
1.12.0
1.11.3
1.11.2
1.11.1
1.11.0
1.10.5
1.10.4
1.10.3
1.10.2
1.10.1
1.10.0
1.9.3
1.9.2
retired
1.9.1
1.9.0
1.8.0
1.7.17
1.7.16
1.7.15
1.7.14
retired
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
retired
1.7.1
retired
1.7.0
retired
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.1
1.2.0
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.11.0
0.10.1
0.10.0
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.3
0.8.2
0.8.1
0.8.0
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.4.0-rc.0
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
Craft and deploy bulletproof embedded software
Current section
Files
Jump to
Current section
Files
lib/nerves/artifact/build_runners/container/instance.ex
# SPDX-FileCopyrightText: 2026 Thomas Winkler
#
# SPDX-License-Identifier: Apache-2.0
#
defmodule Nerves.Artifact.BuildRunners.Container.Instance do
@moduledoc false
import Nerves.Artifact.BuildRunners.Container.Utils
@doc """
All containers (any state) that reference one of the given named volumes.
Returns `%{id: String.t(), state: String.t()}` entries; fails open with `[]`
when the CLI or JSON output is unavailable.
"""
@spec using_volumes([String.t()]) :: [%{id: String.t(), state: String.t()}]
def using_volumes(volumes) do
with {result, 0} <-
System.cmd("container", ["list", "--all", "--format", "json"], stderr_to_stdout: true),
{:ok, containers} <- Jason.decode(result) do
containers
|> Enum.filter(&references_volume?(&1, volumes))
|> Enum.map(fn container ->
%{
id: container["id"] || get_in(container, ["configuration", "id"]),
state: get_in(container, ["status", "state"]) || "stopped"
}
end)
else
_ -> []
end
end
defp references_volume?(container, volumes) do
container
|> get_in(["configuration", "mounts"])
|> List.wrap()
|> Enum.any?(fn
%{"type" => %{"volume" => %{"name" => name}}} -> name in volumes
_ -> false
end)
end
@spec stop(String.t()) :: :ok
def stop(id) do
shell_info("Stopping container #{id}")
_ = System.cmd("container", ["stop", id], stderr_to_stdout: true)
:ok
end
@spec delete(String.t()) :: :ok
def delete(id) do
shell_info("Removing container #{id}")
_ = System.cmd("container", ["delete", id], stderr_to_stdout: true)
:ok
end
end