lib/nerves/artifact/build_runners/docker/image.ex

defmodule Nerves.Artifact.BuildRunners.Docker.Image do
  alias Nerves.Artifact.BuildRunners.Docker
  import Docker.Utils

  def create(dockerfile, tag) do
    cmd = "docker"
    path = Path.dirname(dockerfile)
    args = ["build", "--tag", "#{tag}", path]
    shell_info("Create image")

    if Mix.shell().yes?("The Nerves Docker build_runner needs to create the image.\nProceed? ") do
      case Mix.Nerves.Utils.shell(cmd, args) do
        {_, 0} -> :ok
        _ -> Mix.raise("Nerves Docker build_runner could not create docker volume nerves_cache")
      end
    else
      Mix.raise("Unable to use Nerves Docker build_runner without image")
    end
  end

  def pull(tag) do
    shell_info("Trying to pull image")
    cmd = "docker"
    args = ["pull", "#{tag}"]

    case Nerves.Port.cmd(cmd, args, stderr_to_stdout: true) do
      {<<"Cannot connect to the Docker daemon", _tail::binary>>, _} ->
        Mix.raise("Nerves Docker build_runner is unable to connect to docker daemon")

      {_, 0} ->
        true

      {_reason, _} ->
        false
    end
  end

  def exists?(tag) do
    cmd = "docker"
    args = ["image", "ls", "#{tag}", "-q"]

    case Nerves.Port.cmd(cmd, args, stderr_to_stdout: true) do
      {"", _} ->
        false

      {<<"Cannot connect to the Docker daemon", _tail::binary>>, _} ->
        Mix.raise("Nerves Docker build_runner is unable to connect to docker daemon")

      {_, 0} ->
        true
    end
  end
end