Skip to content

Commit

Permalink
Merge pull request dokku#5069 from dokku/5065-enter-run-fix
Browse files Browse the repository at this point in the history
Do not start intermediate container when calling dokku run after a failed build
  • Loading branch information
josegonzalez authored Apr 21, 2022
2 parents 72c18da + 73b7597 commit d38a873
Show file tree
Hide file tree
Showing 8 changed files with 69 additions and 31 deletions.
4 changes: 2 additions & 2 deletions plugins/builder-dockerfile/builder-build
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ trigger-builder-dockerfile-builder-build() {
dokku_log_info1 "Building $APP from Dockerfile"

local IMAGE=$(get_app_image_name "$APP")
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"
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=build")

pushd "$SOURCECODE_WORK_DIR" &>/dev/null

Expand All @@ -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"
}
Expand Down
4 changes: 2 additions & 2 deletions plugins/builder-dockerfile/builder-release
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,15 @@ 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"
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")
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
if ! "$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
Expand Down
39 changes: 29 additions & 10 deletions plugins/builder-herokuish/builder-build
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ trigger-builder-herokuish-builder-build() {
local DOKKU_APP_CACHE_DIR="$DOKKU_ROOT/$APP/cache"
local DOKKU_APP_HOST_CACHE_DIR="$DOKKU_HOST_ROOT/$APP/cache"
local DOCKER_COMMIT_LABEL_ARGS=("--change" "LABEL org.label-schema.schema-version=1.0" "--change" "LABEL org.label-schema.vendor=dokku" "--change" "LABEL com.dokku.app-name=$APP")
local DOCKER_RUN_LABEL_ARGS="--label=com.dokku.app-name=$APP"
local CID
local DOCKER_RUN_LABEL_ARGS=("--label=com.dokku.image-stage=build" "--label=com.dokku.app-name=$APP")
local CID TAR_CID

pushd "$SOURCECODE_WORK_DIR" &>/dev/null

Expand All @@ -34,14 +34,20 @@ trigger-builder-herokuish-builder-build() {
NEW_DOKKU_IMAGE=$(plugn trigger builder-dokku-image "$BUILDER_TYPE" "$APP" "$SOURCECODE_WORK_DIR" "$DOKKU_IMAGE")
[[ -n "$NEW_DOKKU_IMAGE" ]] && DOKKU_IMAGE="$NEW_DOKKU_IMAGE"

CID=$(tar -c . | "$DOCKER_BIN" container run "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS -i -a stdin "$DOKKU_IMAGE" /bin/bash -c "mkdir -p /app && tar -xC /app")
if test "$("$DOCKER_BIN" container wait "$CID")" -ne 0; then
if ! TAR_CID=$(tar -c . | "$DOCKER_BIN" container run "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS -i -a stdin "$DOKKU_IMAGE" /bin/bash -c "mkdir -p /app && tar -xC /app"); then
DOKKU_SKIP_IMAGE_CLEANUP_REGISTRATION=1 plugn trigger scheduler-register-retired "$APP" "$TAR_CID"
dokku_log_warn "Failure extracting app code"
return 1
fi

"$DOCKER_BIN" container commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" "$CID" "$IMAGE" >/dev/null
DOKKU_SKIP_IMAGE_CLEANUP_REGISTRATION=1 plugn trigger scheduler-register-retired "$APP" "$CID"
if test "$("$DOCKER_BIN" container wait "$TAR_CID")" -ne 0; then
DOKKU_SKIP_IMAGE_CLEANUP_REGISTRATION=1 plugn trigger scheduler-register-retired "$APP" "$TAR_CID"
dokku_log_warn "Failure extracting app code"
return 1
fi

"$DOCKER_BIN" container commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" "$TAR_CID" "$IMAGE" >/dev/null
DOKKU_SKIP_IMAGE_CLEANUP_REGISTRATION=1 plugn trigger scheduler-register-retired "$APP" "$TAR_CID"

[[ -d $DOKKU_APP_CACHE_DIR ]] || mkdir -p "$DOKKU_APP_CACHE_DIR"
plugn trigger pre-build-buildpack "$APP" "$SOURCECODE_WORK_DIR"
Expand All @@ -54,20 +60,33 @@ trigger-builder-herokuish-builder-build() {
eval "ARG_ARRAY=($DOCKER_ARGS)"

local DOKKU_CONTAINER_EXIT_CODE=0
local CID=$("$DOCKER_BIN" container create "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS -v $DOKKU_APP_HOST_CACHE_DIR:/cache --env=CACHE_PATH=/cache "${ARG_ARRAY[@]}" $IMAGE /build)
if ! CID=$("$DOCKER_BIN" container create "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS -v "$DOKKU_APP_HOST_CACHE_DIR:/cache" --env=CACHE_PATH=/cache "${ARG_ARRAY[@]}" "$IMAGE" /build); then
DOKKU_SKIP_IMAGE_CLEANUP_REGISTRATION=1 plugn trigger scheduler-register-retired "$APP" "$TAR_CID"
plugn trigger scheduler-register-retired "$APP" "$CID"
dokku_log_warn "Failure during app build"
return 1
fi

plugn trigger post-container-create "app" "$CID" "$APP" "build"
"$DOCKER_BIN" container start "$CID" >/dev/null || DOKKU_CONTAINER_EXIT_CODE=$?
"$DOCKER_BIN" container attach "$CID"
DOKKU_CONTAINER_EXIT_CODE="$("$DOCKER_BIN" container wait "$CID" 2>/dev/null || echo "$DOKKU_CONTAINER_EXIT_CODE")"
if ! "$DOCKER_BIN" container attach "$CID"; then
DOKKU_SKIP_IMAGE_CLEANUP_REGISTRATION=1 plugn trigger scheduler-register-retired "$APP" "$TAR_CID"
plugn trigger scheduler-register-retired "$APP" "$CID"
dokku_log_warn "Failure during app build"
return 1
fi

DOKKU_CONTAINER_EXIT_CODE="$("$DOCKER_BIN" container wait "$CID" 2>/dev/null || echo "$DOKKU_CONTAINER_EXIT_CODE")"
if [[ "$DOKKU_CONTAINER_EXIT_CODE" -ne 0 ]]; then
DOKKU_SKIP_IMAGE_CLEANUP_REGISTRATION=1 plugn trigger scheduler-register-retired "$APP" "$TAR_CID"
plugn trigger scheduler-register-retired "$APP" "$CID"
dokku_log_warn "Failure during app build"
return 1
fi

"$DOCKER_BIN" container commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" "$CID" "$IMAGE" >/dev/null
DOKKU_SKIP_IMAGE_CLEANUP_REGISTRATION=1 plugn trigger scheduler-register-retired "$APP" "$TAR_CID"
plugn trigger scheduler-register-retired "$APP" "$CID"

plugn trigger post-build-buildpack "$APP" "$SOURCECODE_WORK_DIR"
}

Expand Down
4 changes: 2 additions & 2 deletions plugins/builder-herokuish/builder-release
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ trigger-builder-herokuish-builder-release() {

local CID
local IMAGE=$(get_app_image_name "$APP" "$IMAGE_TAG")
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"
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-buildpack "$APP" "$IMAGE_TAG"

Expand All @@ -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
Expand Down
18 changes: 16 additions & 2 deletions plugins/common/functions
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ dokku_log_fail_quiet() {
dokku_log_fail() {
declare desc="log fail formatter"
echo " ! $*" 1>&2
exit ${DOKKU_FAIL_EXIT_CODE:=1}
exit "${DOKKU_FAIL_EXIT_CODE:=1}"
}

dokku_log_stderr() {
Expand Down Expand Up @@ -624,7 +624,21 @@ dokku_build() {
declare desc="build phase"
declare APP="$1" IMAGE_SOURCE_TYPE="$2" SOURCECODE_WORK_DIR="$3"

plugn trigger builder-build "$IMAGE_SOURCE_TYPE" "$APP" "$SOURCECODE_WORK_DIR"
local IMAGE=$(get_app_image_name "$APP")
local RELEASED_IMAGE_ID="$(docker image ls --filter "label=com.dokku.image-stage=release" --filter "label=com.dokku.app-name=$APP" --format "{{.ID}}")"
if plugn trigger builder-build "$IMAGE_SOURCE_TYPE" "$APP" "$SOURCECODE_WORK_DIR"; then
return
fi

if [[ -n "$RELEASED_IMAGE_ID" ]]; then
dokku_log_warn "Retagging old image $RELEASED_IMAGE_ID as $IMAGE"
"$DOCKER_BIN" image tag "$RELEASED_IMAGE_ID" "$IMAGE" 2>/dev/null || true
else
dokku_log_warn "Removing invalid image tag $IMAGE"
"$DOCKER_BIN" image remove --force --no-prune "$IMAGE" &>/dev/null || true
fi

dokku_log_fail "App build failed"
}

dokku_release() {
Expand Down
2 changes: 1 addition & 1 deletion plugins/scheduler-docker-local/internal-functions
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ fn-scheduler-docker-local-retire-images() {
fi

dokku_log_verbose_quiet "Attempting to retire $RETIRE_APP image $IMAGE_ID"
if RM_OUTPUT="$("$DOCKER_BIN" image rm "$IMAGE_ID" 2>&1)"; then
if RM_OUTPUT="$("$DOCKER_BIN" image remove "$IMAGE_ID" 2>&1)"; then
DEAD_IMAGES+=("$IMAGE_ID")
continue
fi
Expand Down
2 changes: 1 addition & 1 deletion plugins/scheduler-docker-local/post-delete
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ trigger-scheduler-docker-local-post-delete() {
fi

# shellcheck disable=SC2046
"$DOCKER_BIN" image rm $("$DOCKER_BIN" image list --quiet "$IMAGE_REPO" | xargs) &>/dev/null || true
"$DOCKER_BIN" image remove $("$DOCKER_BIN" image list --quiet "$IMAGE_REPO" | xargs) &>/dev/null || true
}

trigger-scheduler-docker-local-post-delete "$@"
27 changes: 16 additions & 11 deletions plugins/scheduler-docker-local/scheduler-run
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ trigger-scheduler-docker-local-scheduler-run() {

local IMAGE_TAG=$(get_running_image_tag "$APP")
local IMAGE=$(get_deploying_app_image_name "$APP" "$IMAGE_TAG")
local IMAGE_STAGE="$("$DOCKER_BIN" image inspect -f '{{ index .Config.Labels "com.dokku.image-stage" }}' "$IMAGE")"
if [[ "$IMAGE_STAGE" != "release" ]]; then
dokku_log_warn "Invalid image stage detected: expected 'release', got '$IMAGE_STAGE'"
dokku_log_warn "Successfully deploy your app to fix dokku run calls"
return 1
fi

if [[ -z "$DOKKU_RM_CONTAINER" ]]; then
local DOKKU_APP_RM_CONTAINER=$(config_get "$APP" DOKKU_RM_CONTAINER || true)
Expand Down Expand Up @@ -67,12 +73,14 @@ trigger-scheduler-docker-local-scheduler-run() {
[[ "$IMAGE_SOURCE_TYPE" == "herokuish" ]] && local EXEC_CMD="/exec"
is_image_cnb_based "$IMAGE" && EXEC_CMD=""

POTENTIAL_PROCFILE_KEY="$1"
PROC_CMD=$(plugn trigger procfile-get-command "$APP" "$POTENTIAL_PROCFILE_KEY" "5000" 2>/dev/null || echo '')
local POTENTIAL_PROCFILE_KEY="$1"
if [[ -n "$POTENTIAL_PROCFILE_KEY" ]]; then
PROC_CMD=$(plugn trigger procfile-get-command "$APP" "$POTENTIAL_PROCFILE_KEY" "5000" 2>/dev/null || echo '')

if [[ -n "$PROC_CMD" ]]; then
dokku_log_info1_quiet "Found '$POTENTIAL_PROCFILE_KEY' in Procfile, running that command"
set -- "$PROC_CMD" "${@:2}"
if [[ -n "$PROC_CMD" ]]; then
dokku_log_info1_quiet "Found '$POTENTIAL_PROCFILE_KEY' in Procfile, running that command"
set -- "$PROC_CMD" "${@:2}"
fi
fi

# shellcheck disable=SC2124
Expand All @@ -99,9 +107,6 @@ trigger-scheduler-docker-local-scheduler-run() {
ARG_ARRAY=("${ARG_ARRAY[@]}" "$DOKKU_SHELL")
else
ARG_ARRAY=("${ARG_ARRAY[@]}" "${RUN_COMMAND[@]}")
# for run_arg in "${RUN_COMMAND[@]}"; do
# DOCKER_ARGS+=" ${run_arg} "
# done
fi

CONTAINER_ID=$(fn-scheduler-docker-local-start-app-container "$APP" "${ARG_ARRAY[@]}")
Expand All @@ -111,15 +116,15 @@ trigger-scheduler-docker-local-scheduler-run() {
if [[ "$DOKKU_DETACH_CONTAINER" != "1" ]]; then
DOCKER_START_ARGS_ARRAY+=("--attach")

has_tty && DOCKER_START_ARGS_ARRAY+=" --interactive"
has_tty && DOCKER_START_ARGS_ARRAY+=("--interactive")
fi

local EXIT_CODE=0 DOKKU_CONTAINER_EXIT_CODE=0
if [[ "$DOKKU_DETACH_CONTAINER" == "1" ]]; then
"$DOCKER_BIN" container start ${DOCKER_START_ARGS_ARRAY[@]} "$CONTAINER_ID" >/dev/null || DOKKU_CONTAINER_EXIT_CODE=$?
"$DOCKER_BIN" container start "${DOCKER_START_ARGS_ARRAY[@]}" "$CONTAINER_ID" >/dev/null || DOKKU_CONTAINER_EXIT_CODE=$?
echo "$CONTAINER_ID"
else
"$DOCKER_BIN" container start ${DOCKER_START_ARGS_ARRAY[@]} "$CONTAINER_ID" || EXIT_CODE=$?
"$DOCKER_BIN" container start "${DOCKER_START_ARGS_ARRAY[@]}" "$CONTAINER_ID" || EXIT_CODE=$?
DOKKU_CONTAINER_EXIT_CODE="$("$DOCKER_BIN" container wait "$CONTAINER_ID" 2>/dev/null || echo "$EXIT_CODE")"
[[ -z "$DOKKU_CONTAINER_EXIT_CODE" ]] && DOKKU_CONTAINER_EXIT_CODE=0
fi
Expand Down

0 comments on commit d38a873

Please sign in to comment.