class Kontena::Cli::Stacks::BuildCommand

Public Instance Methods

build_docker_image(service) click to toggle source

@param [Hash] service @return [Integer]

# File lib/kontena/cli/stacks/build_command.rb, line 74
def build_docker_image(service)
  dockerfile = dockerfile = service['build']['dockerfile'] || 'Dockerfile'
  build_context = service['build']['context']
  cmd = ['docker', 'build', '-t', service['image']]
  cmd << ['-f', File.join(File.expand_path(build_context), dockerfile)] if dockerfile != "Dockerfile"
  cmd << '--no-cache' if no_cache?
  cmd << '--pull' unless no_pull?
  cmd.unshift('sudo') if sudo?

  args = service['build']['args'] || {}
  args.each do |k, v|
    cmd << "--build-arg=#{k}=#{v}"
  end
  cmd << build_context
  ret = system(*cmd.flatten)
  raise ("Failed to build image #{pastel.cyan(service['image'])}") unless ret
  ret
end
build_docker_images(services) click to toggle source

@param [Hash] services

# File lib/kontena/cli/stacks/build_command.rb, line 46
def build_docker_images(services)
  services.each do |service|
    if service['build']
      dockerfile = service['build']['dockerfile'] || 'Dockerfile'
      abort("'#{service['image']}' is not valid Docker image name") unless valid_image_name?(service['image'])
      abort("'#{service['build']['context']}' does not have #{dockerfile}") unless dockerfile_exist?(service['build']['context'], dockerfile)
      if service['hooks'] && service['hooks']['pre_build']
        puts pastel.cyan("Running pre_build hook")
        run_pre_build_hook(service['hooks']['pre_build'])
      end
      puts "Building image #{pastel.cyan(service['image'])}"
      build_docker_image(service)
    end
  end
end
dockerfile_exist?(path, dockerfile) click to toggle source

@param [String] path @param [String] dockerfile @return [Boolean]

# File lib/kontena/cli/stacks/build_command.rb, line 112
def dockerfile_exist?(path, dockerfile)
  file = File.join(File.expand_path(path), dockerfile)
  File.exist?(file)
end
execute() click to toggle source
# File lib/kontena/cli/stacks/build_command.rb, line 28
def execute
  set_env_variables(stack_name, current_grid)
  stack # runs validations

  services = stack['services']

  unless service_list.empty?
    services.select! { |service| service_list.include?(service['name']) }
  end

  if services.none?{ |service| service['build'] }
    abort pastel.red("Didn't find any services to build")
  end
  build_docker_images(services)
  push_docker_images(services) unless no_push?
end
push_docker_image(image) click to toggle source

@param [String] image @return [Integer]

# File lib/kontena/cli/stacks/build_command.rb, line 95
def push_docker_image(image)
  cmd = ['docker', 'push', image]
  cmd.unshift('sudo') if sudo?
  ret = system(*cmd)
  raise ("Failed to push image #{pastel.cyan(image)}") unless ret
  ret
end
push_docker_images(services) click to toggle source

@param [Hash] services

# File lib/kontena/cli/stacks/build_command.rb, line 63
def push_docker_images(services)
  services.each do |service|
    if service['build']
      puts "Pushing image #{pastel.cyan(service['image'])}"
      push_docker_image(service['image'])
    end
  end
end
run_pre_build_hook(hook) click to toggle source

@param [Hash] hook

# File lib/kontena/cli/stacks/build_command.rb, line 118
def run_pre_build_hook(hook)
  hook.each do |h|
    ret = system(h['cmd'])
    raise ("Failed to run pre_build hook: #{h['name']}!") unless ret
  end
end
valid_image_name?(name) click to toggle source

@param [String] name @return [Boolean]

# File lib/kontena/cli/stacks/build_command.rb, line 105
def valid_image_name?(name)
  !(/\A[\w.\/\-:]+:?+[\w+.]+\z/ =~ name).nil?
end