class QB::Docker::Image

Public Class Methods

build!(name:, path:, push: false, tags: [], _cmd_stream: true, **build_opts) click to toggle source
# File lib/qb/docker/image.rb, line 78
def self.build! name:,
                path:,
                push: false,
                tags: [],
                _cmd_stream: true,
                **build_opts
  
  cmd = QB::Docker::CLI.build_cmd path, tag: name.to_s, **build_opts
  
  logger.info "building...",
    name: name.to_s,
    path: path,
    push: push,
    _cmd_stream: _cmd_stream,
    cmd: cmd.prepare
  
  result = run_cmd! cmd, stream: _cmd_stream
  
  tags.each do |tag_arg|
    cmd = QB::Docker::CLI.tag_cmd name, tag_arg
    tag = cmd.args[1]
    logger.debug "Tagging #{ name } as #{ tag }",
      tag_arg: tag_arg
    
    result = run_cmd cmd, stream: _cmd_stream
    
    if result.ok?
      logger.info "Tagged #{ name } as #{ tag }.",
        cmd: cmd.last_prepared_cmd
    else
      logger.error "Failed to tag #{ name } as #{ tag }",
        tag_arg: tag_arg,
        cmd: cmd.last_prepared_cmd
    end
  end
  
  QB::Docker::CLI.push( name ) if push
  
  result
end
ensure_present!(name:, pull: nil, build: nil, force: false, push: false, tags: []) click to toggle source
# File lib/qb/docker/image.rb, line 120
def self.ensure_present! name:,
    pull: nil,
    build: nil,
    force: false,
    push: false,
    tags: []
  
  name = QB::Docker::Image::Name.from name
  
  if  pull.nil? &&
      name.tag &&
      name.tag.version.is_a?( QB::Package::Version::Leveled )
    pull = !name.tag.version.dev?
  end
  
  logger.info "Ensuring image is present...",
    name: name.to_s,
    pull: pull,
    push: push,
    force: force
  
  if force
    logger.info "Forcing build...",
      name: name.to_s
      
    build! name: name, push: push, tags: tags, **build
    
    return
  end
  
  if name.exists?
    logger.info "Image exists", name: name.to_s
    return
  end
  
  logger.info "Name does NOT exist",
    name: name.to_s
    
  if pull
    logger.info "Attempting to pull...",
      name: name.to_s
    
    return if QB::Docker::CLI.pull?( name )
  end
    
  
  logger.info "Resorting to building...",
    name: name.to_s,
    path: build[:path]
  
  build! name: name, push: push, tags: tags, **build
  
end
names(**opts) click to toggle source

Class Methods

# File lib/qb/docker/image.rb, line 47
def self.names **opts
  QB::Docker::CLI.image_names **opts
end

Private Class Methods

run_cmd(cmd, stream: true, raise_on_fail: false) click to toggle source
# File lib/qb/docker/image.rb, line 52
def self.run_cmd cmd, stream: true, raise_on_fail: false
  if stream
    if raise_on_fail
      cmd.stream!
    else
      cmd.stream
    end
  else
    cmd.capture.tap { |result|
      if raise_on_fail && result.error?
        raise QB::Docker::CLI::Error.from_result result
      end
    }
  end
end
run_cmd!(cmd, stream: true) click to toggle source
# File lib/qb/docker/image.rb, line 71
def self.run_cmd! cmd, stream: true
  run_cmd cmd, stream: stream, raise_on_fail: true
end