Time based container and image retention can have variable space requirements depending on how often we deploy. - Only prune stopped containers, retaining the 5 newest - Then prune dangling images so we only keep images for the retained containers.
21 lines
682 B
Ruby
21 lines
682 B
Ruby
require "active_support/duration"
|
|
require "active_support/core_ext/numeric/time"
|
|
|
|
class Mrsk::Commands::Prune < Mrsk::Commands::Base
|
|
def images
|
|
docker :image, :prune, "--all", "--force", "--filter", "label=service=#{config.service}", "--filter", "dangling=true"
|
|
end
|
|
|
|
def containers(keep_last: 5)
|
|
pipe \
|
|
docker(:ps, "-q", "-a", "--filter", "label=service=#{config.service}", *stopped_containers_filters),
|
|
"tail -n +#{keep_last + 1}",
|
|
"while read container_id; do docker rm $container_id; done"
|
|
end
|
|
|
|
private
|
|
def stopped_containers_filters
|
|
[ "created", "exited", "dead" ].flat_map { |status| ["--filter", "status=#{status}"] }
|
|
end
|
|
end
|