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