class DockerTools::Image

Attributes

dir[RW]
full_name[RW]
image[RW]
name[RW]
registry[RW]
tag[RW]

Public Class Methods

new(name, registry, tag, dir=nil, lookup=true) click to toggle source
# File lib/docker_tools/image.rb, line 11
def initialize(name, registry, tag, dir=nil, lookup=true)
  @name = name
  @registry = registry
  @tag = tag
  @full_name = "#{registry}/#{name}:#{tag}" unless registry.nil?
  @full_name = "#{name}:#{tag}" if registry.nil?
  @image_name = "#{registry}/#{name}" unless registry.nil?
  @image_name = name if registry.nil?
  @dir = dir
  @dockerfile = "#{dir}/Dockerfile.template" unless dir.nil?
  @image = lookup_image if lookup
  # Set the read timeout for the connection
  Excon.defaults[:read_timeout] = DockerTools.image_timeout
end

Public Instance Methods

build(registry: @registry, tag: @tag, method: 'image', distro: 'precise', fallback_tag: DockerTools.dependency_fallback_tag, no_pull: DockerTools.no_pull, template_vars: {}, rm: false, no_cache: false) click to toggle source
# File lib/docker_tools/image.rb, line 34
def build(registry: @registry, tag: @tag, method: 'image', distro: 'precise', fallback_tag: DockerTools.dependency_fallback_tag, no_pull: DockerTools.no_pull, template_vars: {}, rm: false, no_cache: false)
  case method
  when 'image'
    dependency_tag = dependency['tag']
    dependency_tag = DockerTools::Dependency.new(dependency['repository'], dependency['registry'], dependency['tag'], fallback_tag).run unless no_pull

    dockerfile_path = "#{@dir}/Dockerfile"
    dockerfile_contents = dockerfile(@name, registry, dependency_tag, template_vars)
    File.open(dockerfile_path, 'w') { | file | file.write(dockerfile_contents) }
    @image = Docker::Image.build_from_dir(@dir, { 'rm' => rm, 'nocache' => no_cache }) do | chunk |
      DockerTools::Util.parse_output(chunk) do | output |
        if output.kind_of?(Hash)
          if output.has_key?('error')
            puts output['error']
            raise output['error']
          end
          puts output['stream'] if output.has_key?('stream')
        else
          puts output
        end
      end
    end
    File.delete(dockerfile_path)
  when 'debootstrap'
    debootstrap = DockerTools::Debootstrap.new(@name, distro)
    debootstrap.run
    @image = Docker::Image.import(debootstrap.archive)
    debootstrap.cleanup
  else
    raise "Invalid value for method: #{method}"
  end
  @image.tag('repo' => "#{@registry}/#{@name}", 'tag' => @tag, 'force' => true)
  @image
end
dependency() click to toggle source
# File lib/docker_tools/image.rb, line 73
def dependency
  if @dockerfile.nil?
    return nil
  else
    template = dockerfile
    dependency = {}
    if template =~ /(FROM|from)\s+(\S+)\/(\S+):(\S+)/
      dependency['registry'] = $2
      dependency['repository'] = $3
      dependency['tag'] = $4
      return dependency
    elsif template =~ /(FROM|from)\s+(\S+):(\S+)/
      dependency['registry'] = nil
      dependency['repository'] = $2
      dependency['tag'] = $3
    elsif template =~ /(FROM|from)\s+(\S+)$/
      dependency['registry'] = nil
      dependency['repository'] = $2
      dependency['tag'] = nil
    end
    dependency
  end
end
pull() click to toggle source
# File lib/docker_tools/image.rb, line 26
def pull
  puts "Pulling image #{@image_name}"
  Docker::Image.create('fromImage' => @image_name, 'tag' => @tag)
  @image = lookup_image.tap do |image|
    raise "Failed to pull image '#{image_name}' with tag '#{@tag}'." if image.nil?
  end
end

Private Instance Methods

dockerfile(name = @name, registry = @registry, tag = @tag, args = {}) click to toggle source
# File lib/docker_tools/image.rb, line 103
def dockerfile(name = @name, registry = @registry, tag = @tag, args = {})
  raise "Must specify Dockerfile location in image" if @dockerfile.nil?
  template = Erubis::Eruby.new(File.read(@dockerfile))
  template_vars = { :registry => registry, :tag => tag, :name => name }
  template_vars.merge!(args) if args.kind_of?(Hash)
  template.result(template_vars)
end
image_present?() click to toggle source
# File lib/docker_tools/image.rb, line 98
def image_present?
  throw "Image #{@full_name} is not present on the local machine" if @image.nil?
  return true
end
lookup_image() click to toggle source
# File lib/docker_tools/image.rb, line 111
def lookup_image
  images = Docker::Image.all
  images.each do | image |
    if (image.info['RepoTags'] || []).include?(@full_name)
      return image
    end
  end
  nil
end