class Armada::Container

Attributes

container[R]
id[R]
name[R]

Public Class Methods

create_container_config(image_id, container_name, host, options = {}) click to toggle source
# File lib/armada/docker/container.rb, line 71
def self.create_container_config(image_id, container_name, host, options = {})
  container_config = options[:container_config] || {}
  options[:env_vars][:HOST] = host

  container_config['Image'] = image_id || options[:image]
  container_config['Hostname'] = options[:hostname] || host

  if options[:port_bindings]
    container_config['ExposedPorts'] ||= {}
    options[:port_bindings].keys.each do |port|
      container_config['ExposedPorts'][port] = {}
    end
  end

  if container_name
    container_config['name'] = container_name
    options[:env_vars][:SERVICE_NAME] = container_name
    #should we do soemthing if container name isnt set?
  end

  if options[:env_vars]
    container_config['Env'] = options[:env_vars].map { |k,v| "#{k}=#{v}" }
  end

  if options[:binds]
    container_config['Volumes'] = options[:binds].inject({}) do |memo, v|
      memo[v.split(/:/).last] = {}
      memo
    end
  end

  container_config
end
create_host_config(options) click to toggle source
# File lib/armada/docker/container.rb, line 60
def self.create_host_config(options)
  host_config = options[:host_config] || {}
  host_config['Binds'] = options[:binds] if options[:binds] && !options[:binds].empty?
  host_config['PortBindings'] = options[:port_bindings] if options[:port_bindings]
  host_config['PublishAllPorts'] = true
  host_config['Privileged'] = options[:privileged] || false
  host_config["RestartPolicy"] = options[:restart_policy] || nil

  host_config
end
new(image, docker_host, options) click to toggle source
# File lib/armada/docker/container.rb, line 5
def initialize(image, docker_host, options)
  @docker_host = docker_host
  @id          = nil
  @image       = image
  @name        = options[:container_name]
  @container   = docker_host.get_container(@name)
  @options     = options

  now_in_ns = Integer(Time.now.to_f * 1000000.0)
  @options[:binds] ||= []
end

Public Instance Methods

create(container_config) click to toggle source
# File lib/armada/docker/container.rb, line 40
def create(container_config)
  ::Docker::Container.create(container_config, @docker_host.connection)
end
kill() click to toggle source
# File lib/armada/docker/container.rb, line 44
def kill
  return if @container.nil?
  info "Stopping old container #{@container.id[0..7]} (#{@name})"
  @container.kill :v => @options[:volumes]
end
ports() click to toggle source
# File lib/armada/docker/container.rb, line 105
def ports
  return @container.json["NetworkSettings"]["Ports"]
end
remove() click to toggle source
# File lib/armada/docker/container.rb, line 50
def remove
  return if @container.nil?
  info "Deleting old container #{@container.id[0..7]} (#{@name})"
  begin
    @container.remove
  rescue Exception => e
    error "Could not remove container #{@container.id[0..7]} (#{@name}).\nException was: #{e.message}"
  end
end
start() click to toggle source
# File lib/armada/docker/container.rb, line 27
def start
  info "Creating new container for image - #{@image.name}:#{@image.tag} with image id (#{@image.id}) with container name #{@name}"
  container_config = Armada::Container.create_container_config("#{@image.name}:#{@image.tag}", @name, @docker_host.host, @options)
  begin
    @container = create(container_config)
    @id = @container.id
    info "Starting new container #{@id[0..11]}"
    @container.start!(Armada::Container.create_host_config(@options))
  rescue Exception => e
    raise "Error occured on #{@docker_host.host}:#{@docker_host.port}: #{e.message}"
  end
end
stop() click to toggle source
# File lib/armada/docker/container.rb, line 17
def stop
  if @container
    info "Stopping the running container named - #{@name}"
    kill
    remove
  else
    warn "No container found with the name #{@name}"
  end
end

Private Instance Methods

error(message) click to toggle source
# File lib/armada/docker/container.rb, line 119
def error(message)
  Armada.ui.error "#{@docker_host.host} -- #{message}"
end
info(message) click to toggle source
# File lib/armada/docker/container.rb, line 111
def info(message)
  Armada.ui.info "#{@docker_host.host} -- #{message}"
end
warn(message) click to toggle source
# File lib/armada/docker/container.rb, line 115
def warn(message)
  Armada.ui.warn "#{@docker_host.host} -- #{message}"
end