From 6b50ba66a9fbf52c7466535b2387cd85874eb678 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 9 Oct 2021 15:03:54 -0400 Subject: [PATCH 1/4] fix: properly set label args on dockerfile and herokuish-built images --- plugins/builder-dockerfile/builder-build | 2 +- plugins/builder-herokuish/builder-release | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/builder-dockerfile/builder-build b/plugins/builder-dockerfile/builder-build index 5f05d5ed7..4eed32405 100755 --- a/plugins/builder-dockerfile/builder-build +++ b/plugins/builder-dockerfile/builder-build @@ -36,7 +36,7 @@ trigger-builder-dockerfile-builder-build() { declare -a ARG_ARRAY eval "ARG_ARRAY=($DOCKER_ARGS)" - "$DOCKER_BIN" image build "${DOCKER_BUILD_LABEL_ARGS[@]}" $DOKKU_GLOBAL_BUILD_ARGS "${ARG_ARRAY[@]}" "${DOKKU_DOCKER_BUILD_OPTS[@]}" -t $IMAGE . + "$DOCKER_BIN" image build $DOCKER_BUILD_LABEL_ARGS $DOKKU_GLOBAL_BUILD_ARGS "${ARG_ARRAY[@]}" "${DOKKU_DOCKER_BUILD_OPTS[@]}" -t $IMAGE . plugn trigger post-build-dockerfile "$APP" } diff --git a/plugins/builder-herokuish/builder-release b/plugins/builder-herokuish/builder-release index 9869dd5d2..199a7aa77 100755 --- a/plugins/builder-herokuish/builder-release +++ b/plugins/builder-herokuish/builder-release @@ -25,7 +25,7 @@ trigger-builder-herokuish-builder-release() { config_export global >"$TMP_WORK_DIR/00-global-env.sh" config_export app "$APP" >"$TMP_WORK_DIR/01-app-env.sh" - if ! suppress_output "$DOCKER_BIN" image build "${DOCKER_BUILD_LABEL_ARGS[@]}" $DOKKU_GLOBAL_BUILD_ARGS -f "$PLUGIN_AVAILABLE_PATH/builder-herokuish/dockerfiles/builder-release.Dockerfile" --build-arg APP_IMAGE="$IMAGE" -t $IMAGE "$TMP_WORK_DIR"; then + if ! suppress_output "$DOCKER_BIN" image build $DOCKER_BUILD_LABEL_ARGS $DOKKU_GLOBAL_BUILD_ARGS -f "$PLUGIN_AVAILABLE_PATH/builder-herokuish/dockerfiles/builder-release.Dockerfile" --build-arg APP_IMAGE="$IMAGE" -t $IMAGE "$TMP_WORK_DIR"; then dokku_log_warn "Failure injecting environment variables" return 1 fi From 5cfe7610b2bdeeb48cc5391677ef08a5a06b069b Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 9 Oct 2021 15:05:24 -0400 Subject: [PATCH 2/4] refactor: inject labels in builder-dockerfile using dockerfile While this is slower, it ensures we have a proper image parent and can track images for retirement correctly. --- plugins/builder-dockerfile/builder-release | 11 ++++++++++- .../dockerfiles/builder-release.Dockerfile | 2 ++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 plugins/builder-dockerfile/dockerfiles/builder-release.Dockerfile diff --git a/plugins/builder-dockerfile/builder-release b/plugins/builder-dockerfile/builder-release index 18dcf49f8..497e5146b 100755 --- a/plugins/builder-dockerfile/builder-release +++ b/plugins/builder-dockerfile/builder-release @@ -12,10 +12,19 @@ trigger-builder-dockerfile-builder-release() { return fi + local DOCKER_BUILD_LABEL_ARGS="--label=org.label-schema.schema-version=1.0 --label=org.label-schema.vendor=dokku --label=com.dokku.app-name=$APP --label=com.dokku.image-stage=release --label=dokku" + plugn trigger pre-release-dockerfile "$APP" "$IMAGE_TAG" + TMP_WORK_DIR="$(mktemp -d "/tmp/dokku-${DOKKU_PID}-${FUNCNAME[0]}.XXXXXX")" + trap "rm -rf '$TMP_WORK_DIR' >/dev/null" RETURN INT TERM EXIT + local IMAGE=$(get_app_image_name "$APP" "$IMAGE_TAG") - docker-image-labeler --label=com.dokku.image-stage=release --label=com.dokku.app-name=$APP --label=org.label-schema.schema-version=1.0 --label=org.label-schema.vendor=dokku --label=dokku "$IMAGE" + if ! suppress_output "$DOCKER_BIN" image build "${DOCKER_BUILD_LABEL_ARGS[@]}" $DOKKU_GLOBAL_BUILD_ARGS -f "$PLUGIN_AVAILABLE_PATH/builder-dockerfile/dockerfiles/builder-release.Dockerfile" --build-arg APP_IMAGE="$IMAGE" -t $IMAGE "$TMP_WORK_DIR"; then + dokku_log_warn "Failure injecting docker labels on image" + return 1 + fi + plugn trigger post-release-dockerfile "$APP" "$IMAGE_TAG" plugn trigger post-release-builder "$BUILDER_TYPE" "$APP" "$IMAGE" } diff --git a/plugins/builder-dockerfile/dockerfiles/builder-release.Dockerfile b/plugins/builder-dockerfile/dockerfiles/builder-release.Dockerfile new file mode 100644 index 000000000..cca256f21 --- /dev/null +++ b/plugins/builder-dockerfile/dockerfiles/builder-release.Dockerfile @@ -0,0 +1,2 @@ +ARG APP_IMAGE +FROM $APP_IMAGE From e53e8bb59ff351b2443a6141959e35f6aef9e839 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 9 Oct 2021 15:06:25 -0400 Subject: [PATCH 3/4] fix: register all containers for retirement on app stop This ensures that unused docker images are _also_ removed. While this will mean a `ps:start` requires a rebuild in the case of a force-stop, it ensures we don't have unused images when destroying apps. --- plugins/scheduler-docker-local/scheduler-stop | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/scheduler-docker-local/scheduler-stop b/plugins/scheduler-docker-local/scheduler-stop index d1f5134c8..32ab1e5ed 100755 --- a/plugins/scheduler-docker-local/scheduler-stop +++ b/plugins/scheduler-docker-local/scheduler-stop @@ -31,6 +31,10 @@ trigger-scheduler-docker-local-scheduler-stop() { local DOKKU_APP_CIDS=$(get_app_container_ids "$APP") if [[ -n "$DOKKU_APP_CIDS" ]]; then + for CID in $DOKKU_APP_CIDS; do + plugn trigger scheduler-register-retired "$APP" "$CID" + done + # shellcheck disable=SC2086 "$DOCKER_BIN" container rm --force $DOKKU_APP_CIDS >/dev/null 2>&1 || true fi From 9616473c3a9cc845a0a5516a4f3bf4f317a67fec Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 9 Oct 2021 15:07:50 -0400 Subject: [PATCH 4/4] fix: ensure we retire any alternate tags Dokku currently injects an alternate tag into the image. Without this change, deploying new image tags (via push with a Dockerfile or git:from-image) would result in the old images lying around forever. This change ensures they are registered for removal. Closes #4825 --- plugins/scheduler-docker-local/scheduler-register-retired | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/scheduler-docker-local/scheduler-register-retired b/plugins/scheduler-docker-local/scheduler-register-retired index dd813729e..097bb8884 100755 --- a/plugins/scheduler-docker-local/scheduler-register-retired +++ b/plugins/scheduler-docker-local/scheduler-register-retired @@ -19,7 +19,13 @@ trigger-scheduler-docker-local-scheduler-register-retired() { fn-scheduler-docker-local-register-retired "container" "$APP" "$CONTAINER_ID" "$WAIT" if [[ -n "$IMAGE_ID" ]] && [[ -z "$DOKKU_SKIP_IMAGE_CLEANUP_REGISTRATION" ]]; then + ALT_IMAGE_TAG="$("$DOCKER_BIN" image inspect --format '{{ index .Config.Labels "com.dokku.docker-image-labeler/alternate-tags" }}' "$IMAGE_ID" 2>/dev/null || true)" + fn-scheduler-docker-local-register-retired "image" "$APP" "$IMAGE_ID" "$WAIT" + if [[ -n "$ALT_IMAGE_TAG" ]]; then + ALT_IMAGE_ID="$("$DOCKER_BIN" image inspect --format '{{ .Id }}' "$(echo "$ALT_IMAGE_TAG" | jq -r ".[]")" 2>/dev/null || true)" + fn-scheduler-docker-local-register-retired "image" "$APP" "$(echo "$ALT_IMAGE_ID" | cut -d ':' -f2)" "$WAIT" + fi fi }