class DockerfileParser
DockerfileParser
main class
Public Class Methods
load_file(path)
click to toggle source
Parse Dockerfile from specified path @return [Array<Hash>] parser Dockerfile
# File lib/dockerfile_parser.rb, line 13 def self.load_file(path) loads(File.read(path)) end
loads(s)
click to toggle source
# File lib/dockerfile_parser.rb, line 17 def self.loads(s) dockerfile_array = split_dockerfile(s) p dockerfile_array parse_commands(dockerfile_array).each_cons(2).map do |item| process_steps(dockerfile_array, item[0], item[1][:index]) end end
Private Class Methods
parse_commands(dockerfile_array)
click to toggle source
# File lib/dockerfile_parser.rb, line 29 def self.parse_commands(dockerfile_array) dockerfile_array.each_with_index.map do |cmd, index| { index: index, command: cmd } if @commands.include?(cmd) end.compact! << { index: dockerfile_array.length, command: 'EOF' } end
process_steps(dockerfile_array, step, next_cmd_index)
click to toggle source
# File lib/dockerfile_parser.rb, line 35 def self.process_steps(dockerfile_array, step, next_cmd_index) { command: step[:command], params: split_params( step[:command], dockerfile_array[step[:index] + 1..next_cmd_index - 1] ) } end
split_dockerfile(str)
click to toggle source
# File lib/dockerfile_parser.rb, line 25 def self.split_dockerfile(str) str.gsub(/^\#.+$/, '').gsub(/(\s\\\s)+/i, '').gsub("\n", ' ').squeeze(' ').split(' ') end
split_params(cmd, params)
click to toggle source
# File lib/dockerfile_parser.rb, line 44 def self.split_params(cmd, params) case cmd when 'FROM' then params.join('').split(':') when 'RUN' then params.join(' ').split(/\s(\&|\;)+\s/).map(&:strip) when 'ENV' then { name: params[0], value: params[1..-1].join(' ') } when 'COPY', 'ADD' then { src: params[0], dst: params[1] } else if cmd[0] == '#' end params = params.join(' ') if params.is_a?(Array) YAML.load(params.to_s) end end