class RakeDocker::Container::Provisioner

Attributes

environment[R]
image[R]
name[R]
ports[R]
ready[R]
reporter[R]

Public Class Methods

new(name, image, opts = {}) click to toggle source
# File lib/rake_docker/container.rb, line 146
def initialize(name, image, opts = {})
  @name = name
  @image = image
  @environment = opts[:environment] || {}
  @ports = opts[:ports] || []
  @ready = opts[:ready?]
  @reporter = opts[:reporter] || NullReporter.new
end

Public Instance Methods

execute() click to toggle source
# File lib/rake_docker/container.rb, line 155
def execute
  reporter.checking_if_container_exists(name)
  container = find_container(name)
  if container
    reporter.container_exists(container)
    ensure_container_running(container)
  else
    reporter.container_does_not_exist(name)
    ensure_image_available(image)
    create_and_start_container(name, image, ports, environment)
  end
  reporter.done
end

Private Instance Methods

container_running?(container) click to toggle source
# File lib/rake_docker/container.rb, line 231
def container_running?(container)
  container_status(container) == 'running'
end
container_status(container) click to toggle source
# File lib/rake_docker/container.rb, line 235
def container_status(container)
  container.json['State']['Status']
end
create_and_start_container(name, image, ports, environment) click to toggle source
# File lib/rake_docker/container.rb, line 199
def create_and_start_container(name, image, ports, environment)
  start_container(create_container(image, name, ports, environment))
end
create_container(image, name, ports, environment) click to toggle source
# File lib/rake_docker/container.rb, line 203
def create_container(image, name, ports, environment)
  exposed_ports, port_bindings = process_ports(ports)
  reporter.creating_container(name, image)
  container = Docker::Container.create(
      name: name,
      Image: image,
      ExposedPorts: exposed_ports,
      HostConfig: {
          PortBindings: port_bindings
      },
      Env: environment)
  container = enhance_with_name(container, name)
  reporter.container_created(container)
  container
end
ensure_container_running(container) click to toggle source
# File lib/rake_docker/container.rb, line 188
def ensure_container_running(container)
  reporter.checking_if_container_running(container)
  container = find_container(name)
  if !container_running?(container)
    reporter.container_not_running(container)
    start_container(container)
  else
    reporter.container_running(container)
  end
end
ensure_image_available(image) click to toggle source
# File lib/rake_docker/container.rb, line 171
def ensure_image_available(image)
  reporter.checking_if_image_available(image)
  matching_images = Docker::Image.all(filter: image)
  if matching_images.empty?
    reporter.image_not_available(image)
    pull_image(image)
  else
    reporter.image_available(image)
  end
end
process_ports(ports) click to toggle source
# File lib/rake_docker/container.rb, line 239
def process_ports(ports)
  port_config = ports.reduce({
      exposed_ports: {},
      port_bindings: {}
  }) do |accumulator, port|
    host_port, container_port = port.split(':')
    accumulator[:exposed_ports]["#{container_port}/tcp"] = {}
    accumulator[:port_bindings]["#{container_port}/tcp"] =
        [{:'HostPort' => host_port}]
    accumulator
  end
  [port_config[:exposed_ports], port_config[:port_bindings]]
end
pull_image(image) click to toggle source
# File lib/rake_docker/container.rb, line 182
def pull_image(image)
  reporter.pulling_image(image)
  Docker::Image.create(fromImage: image)
  reporter.image_pulled(image)
end
start_container(container) click to toggle source
# File lib/rake_docker/container.rb, line 219
def start_container(container)
  reporter.starting_container(container)
  container.start
  reporter.container_started(container)
  if ready && ready.respond_to?(:call)
    reporter.waiting_for_container_to_be_ready(container)
    ready.call(container)
    reporter.container_ready(container)
  end
  container
end