class FPM::Fry::DockerFile::Build

Attributes

options[R]

Public Class Methods

new(base, variables, recipe, options = {}) click to toggle source
Calls superclass method
# File lib/fpm/fry/docker_file.rb, line 105
def initialize(base, variables, recipe, options = {})
  variables = variables.dup.freeze
  raise Fry::WithData('unknown flavour', 'flavour' => variables[:flavour]) unless ['debian','redhat'].include? variables[:flavour]
  @options = options.dup.freeze
  super(base, variables, recipe)
end

Public Instance Methods

build_sh() click to toggle source
# File lib/fpm/fry/docker_file.rb, line 162
def build_sh
  df = ['#!/bin/bash']
  df << 'set -e'
  recipe.steps.each do |v|
    if v.respond_to? :name
      df << "echo -e '\\e[1;32m====> #{Shellwords.escape v.name}\\e[0m'"
    end
    df << v.to_s
  end
  df << ''
  return df.join("\n")
end
dockerfile() click to toggle source
# File lib/fpm/fry/docker_file.rb, line 112
def dockerfile
  df = {
    source: [],
    dependencies: [],
    build: []
  }
  df[:source] << "FROM #{base}"
  workdir = '/tmp/build'
  # TODO: get this from cache, not from the source itself
  if recipe.source.respond_to? :to
    to = recipe.source.to || ""
    workdir = File.expand_path(to, workdir)
  end
  df[:source] << "WORKDIR #{workdir}"

  # need to add external sources before running any command
  recipe.build_mounts.each do |source, target|
    df[:dependencies] << "COPY #{source} ./#{target}"
  end

  recipe.before_dependencies_steps.each do |step|
    df[:dependencies] << "RUN #{step.to_s}"
  end

  if build_dependencies.any?
    case(variables[:flavour])
    when 'debian'
      update = ''
      if options[:update]
        update = 'apt-get update && '
      end
      df[:dependencies] << "ENV DEBIAN_FRONTEND=noninteractive"
      df[:dependencies] << "RUN #{update}apt-get install --yes #{Shellwords.join(build_dependencies)}"
    when 'redhat'
      df[:dependencies] << "RUN yum -y install #{Shellwords.join(build_dependencies)}"
    else
      raise "Unknown flavour: #{variables[:flavour]}"
    end
  end

  recipe.before_build_steps.each do |step|
    df[:build] << "RUN #{step.to_s}"
  end

  df[:build] << "COPY .build.sh #{workdir}/"
  df[:build] << "CMD #{workdir}/.build.sh"
  recipe.apply_dockerfile_hooks(df)
  return [*df[:source],*df[:dependencies],*df[:build],""].join("\n")
end
tar_io() click to toggle source
# File lib/fpm/fry/docker_file.rb, line 175
def tar_io
  sio = StringIO.new
  tar = Gem::Package::TarWriter.new(sio)
  tar.add_file('.build.sh','0777') do |io|
    io.write(build_sh)
  end
  tar.add_file(NAME,'0777') do |io|
    io.write(dockerfile)
  end
  recipe.build_mounts.each do |source, _|
    tar.add_file(source,'0777') do |io|
      io.write(File.read(source))
    end
  end
  #tar.close
  sio.rewind
  return sio
end

Private Instance Methods

build_dependencies() click to toggle source
# File lib/fpm/fry/docker_file.rb, line 195
def build_dependencies
  return @build_dependencies if @build_dependencies
  deps = []
  (recipe.build_depends.merge recipe.depends).each do |k,v|
    install = v.fetch(:install,true)
    next unless install
    case( install )
    when true
      deps << simplify_build_dependency(k)
    when String
      deps << simplify_build_dependency(install)
    end
  end
  @build_dependencies = deps.sort
end
simplify_build_dependency( dep ) click to toggle source
# File lib/fpm/fry/docker_file.rb, line 211
def simplify_build_dependency( dep )
  dep.split('|').first.strip
end