class Builder
Attributes
buildSettings[RW]
buildStage[RW]
entrypoint[RW]
stage[RW]
volumes[RW]
Public Class Methods
new(fileLocation, stage=nil, name=nil)
click to toggle source
# File src/dsl/buildContext.rb, line 4 def initialize (fileLocation, stage=nil, name=nil) @name = name @buildStage = stage @buildSettings = { :settings => {}, :docker => [], :files => {}, :volumes => {} } @entrypoint = nil @volumes = {} @cwd = Dir.getwd @fileLocation = fileLocation @output = Tempfile.new('shuttlBuild') @tar = Gem::Package::TarWriter.new(@output) @dirs = [fileLocation, Dir.getwd, File.join(Dir.home, '.shuttl/definitions')] if ENV.key('SHUTTL_PATH') @dirs << ENV['SHUTTL_PATH'].split(":") end end
Public Instance Methods
add(command)
click to toggle source
# File src/dsl/buildContext.rb, line 150 def add (command) @buildSettings[:docker] << command end
addFile(localName, nameInDocker, rootName=nil)
click to toggle source
# File src/dsl/buildContext.rb, line 46 def addFile(localName, nameInDocker, rootName=nil) if rootName.nil? rootName = nameInDocker end begin file = findFile(localName) rescue Errno::EISDIR @tar.mkdir(nameInDocker, 0640) Dir["#{localName}/**/*"].each do |file| pathInDocker = File.join(rootName, file) addFile(file, pathInDocker, rootName) end return end permissions = file.is_a?(Hash) ? file[:permissions] : 0640 @tar.add_file(nameInDocker, permissions) do | tarFile | while buffer = file.read(1024 * 1000) tarFile.write(buffer) end end @tar.flush end
attach(localDir, volume)
click to toggle source
# File src/dsl/buildContext.rb, line 185 def attach(localDir, volume) if localDir == 'pwd' localDir = @cwd end @volumes[volume] = localDir end
build(stage, cwd, clean ) { |v| ... }
click to toggle source
# File src/dsl/buildContext.rb, line 126 def build (stage, cwd, clean ) begin makeImage stage, cwd query = {} query[:buildargs] = {} @buildSettings[:settings].each do |key, value| query[:buildargs][key] = value.to_s end query[:buildargs] = query[:buildargs].merge @env || Hash[] puts query[:buildargs] query[:buildargs] = query[:buildargs].to_json if clean query[:nocache] = true end puts query Docker::Image.build_from_tar @output.tap(&:rewind), query do |v| yield v end ensure @output.close @output.unlink end end
cmd(cmd)
click to toggle source
# File src/dsl/buildContext.rb, line 206 def cmd (cmd) add "CMD #{cmd}" end
create_tar(hash = {}, tap=true)
click to toggle source
# File src/dsl/buildContext.rb, line 70 def create_tar(hash = {}, tap=true) output = StringIO.new Gem::Package::TarWriter.new(output) do |tar| hash.each do |file_name, file_details| permissions = file_details.is_a?(Hash) ? file_details[:permissions] : 0640 tar.add_file(file_name, permissions) do |tar_file| content = file_details.is_a?(Hash) ? file_details[:content] : file_details tar_file.write(content) end end end return output.tap(&:rewind) end
fileAdd(source, destination)
click to toggle source
# File src/dsl/buildContext.rb, line 154 def fileAdd (source, destination) @buildSettings[:files][source] = destination add "ADD #{destination} #{destination}" end
findFile(name)
click to toggle source
# File src/dsl/buildContext.rb, line 20 def findFile(name) found = nil @dirs.each do | dir | potentialFileName = File.join(dir, name) if File.exist? potentialFileName if File.directory? potentialFileName raise Errno::EISDIR end found = File.open(potentialFileName) break end end if found.nil? throw "File not found: #{name}" end found end
gatherFiles(stage, cwd)
click to toggle source
# File src/dsl/buildContext.rb, line 110 def gatherFiles (stage, cwd) files = @buildSettings[:files] files end
gatherSettings(stage)
click to toggle source
# File src/dsl/buildContext.rb, line 84 def gatherSettings (stage) settings = @buildSettings[:settings] end
gatherVolume(stage)
click to toggle source
# File src/dsl/buildContext.rb, line 192 def gatherVolume(stage) @volumes end
getName()
click to toggle source
# File src/dsl/buildContext.rb, line 42 def getName @name end
makeDockerFile(stage)
click to toggle source
# File src/dsl/buildContext.rb, line 88 def makeDockerFile (stage) settings = gatherSettings(stage) settingsArr = [] settings.each do |key, value| settingsArr << "ARG #{key}=#{value}" settingsArr << "ENV #{key}=${#{key}}" end definition = @buildSettings[:docker] definition = [definition[0], ] + settingsArr + definition[1..definition.count] # if @entrypoint # definition << "ENTRYPOINT #{@entrypoint}" # end volumes = gatherVolume stage definition << "RUN echo 'echo SHUTTL IMAGE BOOTED' >> /.shuttl/run" definition << "RUN echo 'bash /.shuttl/start' >> /.shuttl/run" if volumes.keys.count > 0 definition << "VOLUME #{volumes.keys}" end definition.join("\n") end
makeImage(stage, cwd)
click to toggle source
# File src/dsl/buildContext.rb, line 115 def makeImage (stage, cwd) dockerfile = self.makeDockerFile stage files = self.gatherFiles stage, cwd @tar.add_file("Dockerfile", 0640) do |tar_file| tar_file.write(dockerfile) end files.each do |key, val| addFile(key, val) end end
merge(other)
click to toggle source
# File src/dsl/buildContext.rb, line 170 def merge (other) newInfo = @buildSettings.merge(other.buildSettings) do |key, old, newVal| if key == :settings old.merge newVal elsif key == :files old.merge newVal elsif key == :docker old.concat newVal end end @buildSettings = newInfo @volumes = other.volumes.merge @volumes end
on(name) { || ... }
click to toggle source
# File src/dsl/buildContext.rb, line 163 def on (name) if name != @buildStage return end yield end
set(setting, value)
click to toggle source
# File src/dsl/buildContext.rb, line 159 def set (setting, value) @buildSettings[:settings][setting] = value end
setEnvFile(env)
click to toggle source
# File src/dsl/buildContext.rb, line 196 def setEnvFile(env) if env.nil? @env = Hash[] return end File.open(env, 'r') do |fi| @env = JSON.parse(fi.read) end end
setName(name)
click to toggle source
# File src/dsl/buildContext.rb, line 38 def setName(name) @name = name end