class DockerCleaner::Containers
Public Class Methods
new(logger, opts = {})
click to toggle source
# File lib/docker_cleaner/containers.rb, line 3 def initialize(logger, opts = {}) @logger = logger @delay = opts.fetch(:delay, 0) end
Public Instance Methods
remove(container)
click to toggle source
# File lib/docker_cleaner/containers.rb, line 8 def remove(container) @logger.info "Remove #{container.id[0...10]} - #{container.info["Image"]} - #{container.info["Names"][0]}" container.remove v: true @logger.info "Remove #{container.id[0...10]} - #{container.info["Image"]} - #{container.info["Names"][0]}... OK" end
run()
click to toggle source
# File lib/docker_cleaner/containers.rb, line 14 def run # Remove stopped container which stopped with code '0' two_hours_ago = Time.now.to_i - 2 * 3600 Docker::Container.all(all: true).select{ |container| status = container.info["Status"] (status == "Created" && container.info["Created"].to_i < two_hours_ago) || (status.include?("Exited (") && container.info["Created"].to_i < two_hours_ago) }.each do |container| remove(container) sleep(@delay) end containers_per_app = {} Docker::Container.all(all: true).select{ |container| container.info["Status"].include?("Exited") }.each{ |container| app = container.info["Image"].split(":", 2)[0] if containers_per_app[app].nil? containers_per_app[app] = [container] else containers_per_app[app] << container end } containers_per_app.each do |app, containers| containers.shift containers.each do |container| remove(container) sleep(@delay) end end end