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