./share/scripts/gc in docker-utils-0.1.33 vs ./share/scripts/gc in docker-utils-0.1.34

- old
+ new

@@ -1,39 +1,70 @@ #!/usr/bin/env ruby -containers = `docker ps -a -q`.chomp.split("\n").sort +DockerBinaryLocation = `which docker`.chomp -purge_all = ARGV.delete('-a') -kill_running_containers = ARGV.delete('-r') || purge_all -delete_data_containers = ARGV.delete('-d') || purge_all -delete_tagged_images = ARGV.delete('-t') || purge_all +def cmd(*args) + io = IO.popen(args, err: '/dev/null') + io.read.split("\n") +end -unless kill_running_containers - running_containers = `docker ps -q`.chomp.split("\n").sort - containers = containers - running_containers +def docker(*args) + cmd(DockerBinaryLocation, *args) end -unless delete_data_containers - containers = containers.find_all do |cid| - container_name = `docker inspect -f '{{.Name}}' #{cid}`.chomp[1..-1] - container_name !~ /-data$/ +tasks = [:remove_containers, :remove_volumes, :remove_images] +container_filter = [:running] +image_filter = [:untagged] + +while task_pattern = ARGV.shift + case task_pattern.intern + when :all + container_filter = [] + image_filter = [] + when :running + container_filter -= [:running] + when :volumes + # + when :images + image_filter -= [:untagged] end end -containers.each do |cid| - system 'docker', 'kill', cid, err: '/dev/null' - system 'docker', 'rm', cid, err: '/dev/null' + +containers = docker('ps', '-a', '-q').sort + +if container_filter.include? :running + running_containers = docker('ps', '-q').sort + containers = containers - running_containers end -images = `docker images`.chomp.split("\n")[1..-1].map do |ln| + +images = docker('images')[1..-1].map do |ln| parts = ln.split(' ').map{ |part| part unless part == '<none>' } image_name = (parts[0] and parts[1]) ? "#{parts[0]}:#{parts[1]}" : nil {id: parts[2], name: image_name} end -unless delete_tagged_images +if image_filter.include? :untagged images = images.delete_if{ |image| image[:name] } end -images.each do |image| - system 'docker', 'rmi', '-f', image[:id] -end \ No newline at end of file + + +if tasks.include? :remove_containers and containers.length.nonzero? + puts "removing containers" + containers.each do |cid| + docker 'kill', cid + docker 'rm', cid + + puts " #{cid}" + end +end + +if tasks.include? :remove_images and images.length.nonzero? + puts "removing image layers" + images.each do |image| + docker 'rmi', '-f', image[:id] + + puts " #{image[:name]} #{image[:id]}" + end +end