lib/floe/container_runner.rb
# frozen_string_literal: true
require_relative "container_runner/docker_mixin"
require_relative "container_runner/docker"
require_relative "container_runner/kubernetes"
require_relative "container_runner/podman"
module Floe
class ContainerRunner
class << self
def cli_options(optimist)
optimist.banner("")
optimist.banner("Container runner options:")
optimist.opt :container_runner, "Type of runner for docker container images (docker, podman, or kubernetes)", :type => :string, :short => 'r'
optimist.opt :container_runner_options, "Options to pass to the container runner", :type => :strings, :short => 'o'
optimist.opt :docker, "Use docker to run container images (short for --container-runner=docker)", :type => :boolean
optimist.opt :podman, "Use podman to run container images (short for --container-runner=podman)", :type => :boolean
optimist.opt :kubernetes, "Use kubernetes to run container images (short for --container-runner=kubernetes)", :type => :boolean
end
def resolve_cli_options!(opts)
# shortcut support
opts[:container_runner] ||= "docker" if opts[:docker]
opts[:container_runner] ||= "podman" if opts[:podman]
opts[:container_runner] ||= "kubernetes" if opts[:kubernetes]
runner_options = opts[:container_runner_options].to_h { |opt| opt.split("=", 2) }
begin
set_runner(opts[:container_runner], runner_options)
rescue ArgumentError => e
Optimist.die(:container_runner, e.message)
end
end
def runner
@runner || set_runner(nil)
end
def set_runner(name_or_instance, options = {})
@runner =
case name_or_instance
when "docker", nil
Floe::ContainerRunner::Docker.new(options)
when "podman"
Floe::ContainerRunner::Podman.new(options)
when "kubernetes"
Floe::ContainerRunner::Kubernetes.new(options)
when Floe::Runner
name_or_instance
else
raise ArgumentError, "container runner must be one of: docker, podman, kubernetes"
end
end
end
end
end
Floe::Runner.register_scheme("docker", -> { Floe::ContainerRunner.runner })