diff --git a/plugins/scheduler-docker-local/internal-functions b/plugins/scheduler-docker-local/internal-functions index e429438f5..614c20d32 100644 --- a/plugins/scheduler-docker-local/internal-functions +++ b/plugins/scheduler-docker-local/internal-functions @@ -187,6 +187,15 @@ fn-scheduler-docker-local-retire-images() { return fi + local -A SOURCE_IMAGE_APPS=() + local source_app source_image source_image_id + for source_app in $(dokku_apps "false" 2>/dev/null); do + source_image="$(plugn trigger git-get-property "$source_app" "source-image" 2>/dev/null || true)" + [[ -z "$source_image" ]] && continue + source_image_id="$("$DOCKER_BIN" image inspect --format '{{ .Id }}' "$source_image" 2>/dev/null | cut -d: -f2 || true)" + [[ -n "$source_image_id" ]] && SOURCE_IMAGE_APPS["$source_image_id"]="$source_app" + done + DEAD_IMAGES=() while read line; do [[ -z "$line" ]] && continue @@ -209,6 +218,12 @@ fn-scheduler-docker-local-retire-images() { continue fi + if [[ -n "${SOURCE_IMAGE_APPS[$IMAGE_ID]}" ]]; then + dokku_log_warn "Image ${IMAGE_ID} is the source image for ${SOURCE_IMAGE_APPS[$IMAGE_ID]}, removing from retire list" + DEAD_IMAGES+=("$IMAGE_ID") + continue + fi + dokku_log_verbose_quiet "Attempting to retire $RETIRE_APP image $IMAGE_ID" if RM_OUTPUT="$("$DOCKER_BIN" image remove "$IMAGE_ID" 2>&1)"; then DEAD_IMAGES+=("$IMAGE_ID") diff --git a/tests/unit/git_4.bats b/tests/unit/git_4.bats index 0b3cd31c1..530e832cf 100644 --- a/tests/unit/git_4.bats +++ b/tests/unit/git_4.bats @@ -26,7 +26,7 @@ build_python_image() { cp "$TMP_IMAGE_DIR/$PROCFILE" "$TMP_IMAGE_DIR/Procfile" fi - docker image build -t "dokku-test/$TEST_APP:$TAG" -f "$TMP_IMAGE_DIR/alt.Dockerfile" "$TMP_IMAGE_DIR" || exit_code="$?" + docker image build --label "com.dokku.test-app=$TEST_APP" -t "dokku-test/$TEST_APP:$TAG" -f "$TMP_IMAGE_DIR/alt.Dockerfile" "$TMP_IMAGE_DIR" || exit_code="$?" rm -rf "$TMP_IMAGE_DIR" return "$exit_code" } diff --git a/tests/unit/scheduler-docker-local.bats b/tests/unit/scheduler-docker-local.bats index 1d3ead3a3..d523cd90b 100644 --- a/tests/unit/scheduler-docker-local.bats +++ b/tests/unit/scheduler-docker-local.bats @@ -8,6 +8,7 @@ setup() { teardown() { global_teardown + docker image rm "dokku-test/$TEST_APP:shared" &>/dev/null || true } @test "(scheduler-docker-local:report) --global raw and computed keys" { @@ -484,6 +485,60 @@ teardown() { assert_output "running" } +@test "(scheduler-docker-local) ps:retire keeps an image that is another app's source image" { + local SECOND_APP="$TEST_APP-2" TMP_IMAGE_DIR + TMP_IMAGE_DIR="$(mktemp -d "/tmp/${DOKKU_DOMAIN}.XXXXX")" + cp -r "${BATS_TEST_DIRNAME}/../../tests/apps/python/." "$TMP_IMAGE_DIR" + run /bin/bash -c "docker image build -t dokku-test/$TEST_APP:shared -f $TMP_IMAGE_DIR/alt.Dockerfile $TMP_IMAGE_DIR" + echo "output: $output" + echo "status: $status" + rm -rf "$TMP_IMAGE_DIR" + assert_success + + run create_app + echo "output: $output" + echo "status: $status" + assert_success + + run create_app "$SECOND_APP" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku checks:set $TEST_APP wait-to-retire 1" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku git:from-image $TEST_APP dokku-test/$TEST_APP:shared" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku git:from-image $SECOND_APP dokku-test/$TEST_APP:shared" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "tar -C ${BATS_TEST_DIRNAME}/../../tests/apps -cf - python | dokku git:from-archive $TEST_APP --" + echo "output: $output" + echo "status: $status" + assert_success + + sleep 3 + + run /bin/bash -c "dokku ps:retire" + echo "output: $output" + echo "status: $status" + assert_success + assert_output_contains "is the source image for $SECOND_APP" + + run /bin/bash -c "docker image inspect dokku-test/$TEST_APP:shared --format '{{.Id}}'" + echo "output: $output" + echo "status: $status" + assert_success +} + @test "(scheduler-docker-local) procfile quoted arguments on deploy" { run create_app echo "output: $output"