module Kamaze::DockerImage::Concern::Containers

Provide containers method.

Protected Instance Methods

containers(all: true) click to toggle source

List containers.

Containers are indexed by name.

@return [Hash{String => Hash}]

# File lib/kamaze/docker_image/concern/containers.rb, line 27
def containers(all: true)
  [(config[:docker_bin] || executable).to_s].map(&:freeze).freeze.yield_self do |cmd|
    cmd.dup.concat(['ps', (all ? '-a' : nil), '--format', '{{json .}}']).yield_self do |command|
      [].tap do |items|
        Open3.capture3(*command.compact).yield_self do |stdout, _, status|
          stdout.lines.each { |line| items.push(JSON.parse(line)) } if status.success?
        end
      end
    end.map { |h| containers_maker.call(h) }.map { |h| [h.info['Name'].gsub(%r{^/*}, '').to_s, h] }.to_h
  end
end
containers_maker() click to toggle source

Add some methods on retrieved info.

@api private

@return [Proc}

# File lib/kamaze/docker_image/concern/containers.rb, line 44
def containers_maker
  # @type [Hash{String => Object}] given_data
  lambda do |given_data|
    command = [(config[:docker_bin] || executable).to_s]
              .map(&:freeze)
              .concat(['inspect', '--format', '{{json .}}', given_data.fetch('ID')])

    given_data.dup.tap do |result|
      result.singleton_class.tap do |klass|
        :inspection.tap do |method_name|
          klass.__send__(:define_method, method_name) do
            -> { Struct.new(:stdout, :stderr, :status).new(*Open3.capture3(*command.compact)) }
          end
          klass.__send__(:protected, method_name)
        end

        klass.__send__(:define_method, :info) do
          inspection.call.yield_self do |v|
            (v.status.success? ? JSON.parse(v.stdout) : nil).to_h
          end
        end

        klass.__send__(:define_method, :running?) do
          self.info['State'].to_h['Status'] == 'running'
        end
      end
    end.freeze
  end
end