Merge pull request #315 from basecamp/prune-unused-images
Prune unused images correctly
This commit is contained in:
@@ -3,12 +3,15 @@ require "active_support/core_ext/numeric/time"
|
|||||||
|
|
||||||
class Mrsk::Commands::Prune < Mrsk::Commands::Base
|
class Mrsk::Commands::Prune < Mrsk::Commands::Base
|
||||||
def images
|
def images
|
||||||
docker :image, :prune, "--force", "--filter", "label=service=#{config.service}", "--filter", "dangling=true"
|
pipe \
|
||||||
|
docker(:image, :ls, *service_filter, "--format", "'{{.Repository}}:{{.Tag}}'"),
|
||||||
|
"grep -v -w \"#{active_image_list}\"",
|
||||||
|
"while read tag; do docker rmi $tag; done"
|
||||||
end
|
end
|
||||||
|
|
||||||
def containers(keep_last: 5)
|
def containers(keep_last: 5)
|
||||||
pipe \
|
pipe \
|
||||||
docker(:ps, "-q", "-a", "--filter", "label=service=#{config.service}", *stopped_containers_filters),
|
docker(:ps, "-q", "-a", *service_filter, *stopped_containers_filters),
|
||||||
"tail -n +#{keep_last + 1}",
|
"tail -n +#{keep_last + 1}",
|
||||||
"while read container_id; do docker rm $container_id; done"
|
"while read container_id; do docker rm $container_id; done"
|
||||||
end
|
end
|
||||||
@@ -17,4 +20,12 @@ class Mrsk::Commands::Prune < Mrsk::Commands::Base
|
|||||||
def stopped_containers_filters
|
def stopped_containers_filters
|
||||||
[ "created", "exited", "dead" ].flat_map { |status| ["--filter", "status=#{status}"] }
|
[ "created", "exited", "dead" ].flat_map { |status| ["--filter", "status=#{status}"] }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def active_image_list
|
||||||
|
"$(docker container ls -a --format '{{.Image}}\\|' --filter label=service=#{config.service} | tr -d '\\n')#{config.latest_image}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def service_filter
|
||||||
|
[ "--filter", "label=service=#{config.service}" ]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ class CliPruneTest < CliTestCase
|
|||||||
|
|
||||||
test "images" do
|
test "images" do
|
||||||
run_command("images").tap do |output|
|
run_command("images").tap do |output|
|
||||||
assert_match /docker image prune --force --filter label=service=app --filter dangling=true on 1.1.1.\d/, output
|
assert_match "docker image ls --filter label=service=app --format '{{.Repository}}:{{.Tag}}' | grep -v -w \"$(docker container ls -a --format '{{.Image}}\\|' --filter label=service=app | tr -d '\\n')dhh/app:latest\" | while read tag; do docker rmi $tag; done on 1.1.1.", output
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ class CommandsPruneTest < ActiveSupport::TestCase
|
|||||||
|
|
||||||
test "images" do
|
test "images" do
|
||||||
assert_equal \
|
assert_equal \
|
||||||
"docker image prune --force --filter label=service=app --filter dangling=true",
|
"docker image ls --filter label=service=app --format '{{.Repository}}:{{.Tag}}' | grep -v -w \"$(docker container ls -a --format '{{.Image}}\\|' --filter label=service=app | tr -d '\\n')dhh/app:latest\" | while read tag; do docker rmi $tag; done",
|
||||||
new_command.images.join(" ")
|
new_command.images.join(" ")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ server {
|
|||||||
|
|
||||||
location / {
|
location / {
|
||||||
proxy_pass http://loadbalancer;
|
proxy_pass http://loadbalancer;
|
||||||
proxy_connect_timeout 5;
|
proxy_connect_timeout 10;
|
||||||
proxy_send_timeout 5;
|
proxy_send_timeout 10;
|
||||||
proxy_read_timeout 5;
|
proxy_read_timeout 10;
|
||||||
send_timeout 5;
|
send_timeout 10;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ class IntegrationTest < ActiveSupport::TestCase
|
|||||||
assert_equal "404", response.code
|
assert_equal "404", response.code
|
||||||
end
|
end
|
||||||
|
|
||||||
def wait_for_app_to_be_up(timeout: 10, up_count: 3)
|
def wait_for_app_to_be_up(timeout: 20, up_count: 3)
|
||||||
timeout_at = Time.now + timeout
|
timeout_at = Time.now + timeout
|
||||||
up_times = 0
|
up_times = 0
|
||||||
response = app_response
|
response = app_response
|
||||||
|
|||||||
Reference in New Issue
Block a user