From abfb0d39772335824f4548e3e34548fb4f97824d Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Tue, 14 Sep 2021 04:03:40 -0400 Subject: [PATCH 1/7] fix: do not require double quotes when issuing dokku run commands This was broken in the #4736. --- .../scheduler-docker-local/internal-functions | 9 ++-- .../scheduler-docker-local/scheduler-deploy | 22 +++++----- plugins/scheduler-docker-local/scheduler-run | 43 ++++++++++++++----- 3 files changed, 49 insertions(+), 25 deletions(-) diff --git a/plugins/scheduler-docker-local/internal-functions b/plugins/scheduler-docker-local/internal-functions index 889509c05..69ac7aa0c 100755 --- a/plugins/scheduler-docker-local/internal-functions +++ b/plugins/scheduler-docker-local/internal-functions @@ -238,10 +238,11 @@ fn-scheduler-docker-local-register-retired() { fn-scheduler-docker-local-start-app-container() { declare desc="starts a single app container" - declare APP="$1" DOCKER_ARGS="$2" + declare APP="$1" + shift + declare DOCKER_ARGS=("$@") - declare -a __DOKKU_DOCKER_ARG_ARRAY - eval "__DOKKU_DOCKER_ARG_ARRAY=($DOCKER_ARGS)" eval "$(config_export app "$APP" --merged)" - "$DOCKER_BIN" container create "${__DOKKU_DOCKER_ARG_ARRAY[@]}" + # shellcheck disable=SC2124 + "$DOCKER_BIN" container create ${DOCKER_ARGS[@]} } diff --git a/plugins/scheduler-docker-local/scheduler-deploy b/plugins/scheduler-docker-local/scheduler-deploy index bf75d0915..bb404bf90 100755 --- a/plugins/scheduler-docker-local/scheduler-deploy +++ b/plugins/scheduler-docker-local/scheduler-deploy @@ -82,13 +82,13 @@ trigger-scheduler-docker-local-scheduler-deploy() { # start the app local DOCKER_ARGS DOCKER_ARGS=$(: | plugn trigger docker-args-deploy "$APP" "$IMAGE_TAG" "$PROC_TYPE" "$CONTAINER_INDEX") - DOCKER_ARGS+=" --label=com.dokku.process-type=$PROC_TYPE --label=com.dokku.dyno=$DYNO " - DOCKER_ARGS+=" --env=DYNO=$DYNO " - DOCKER_ARGS+=" --name=$APP.$DYNO.upcoming-$RANDOM " - DOCKER_ARGS+=" --init " + DOCKER_ARGS+=" --label=com.dokku.process-type=$PROC_TYPE --label=com.dokku.dyno=$DYNO" + DOCKER_ARGS+=" --env=DYNO=$DYNO" + DOCKER_ARGS+=" --name=$APP.$DYNO.upcoming-$RANDOM" + DOCKER_ARGS+=" --init" DOCKER_ARGS+=" $DOCKER_RUN_LABEL_ARGS $DOKKU_GLOBAL_RUN_ARGS " DOCKER_ARGS+=$(: | plugn trigger docker-args-process-deploy "$APP" "$IMAGE_SOURCE_TYPE" "$IMAGE_TAG" "$PROC_TYPE" "$CONTAINER_INDEX") - [[ "$DOKKU_TRACE" ]] && DOCKER_ARGS+=" --env=TRACE=true " + [[ "$DOKKU_TRACE" ]] && DOCKER_ARGS+=" --env=TRACE=true" local START_CMD [[ "$DOKKU_HEROKUISH" == "true" ]] && START_CMD="/start $PROC_TYPE" @@ -105,18 +105,20 @@ trigger-scheduler-docker-local-scheduler-deploy() { fi if [[ "$DOKKU_NETWORK_BIND_ALL" == "true" ]]; then - DOCKER_ARGS+=" -p $p " + DOCKER_ARGS+=" -p $p" fi done fi - DOCKER_ARGS+=" --env=PORT=$DOKKU_PORT " + DOCKER_ARGS+=" --env=PORT=$DOKKU_PORT" START_CMD=$(fn-scheduler-docker-local-extract-start-cmd "$APP" "$PROC_TYPE" "$START_CMD" "$DOKKU_HEROKUISH" "$DOKKU_PORT") - DOCKER_ARGS+=" $IMAGE " - DOCKER_ARGS+=" $START_CMD " + DOCKER_ARGS+=" $IMAGE" + DOCKER_ARGS+=" $START_CMD" - cid=$(fn-scheduler-docker-local-start-app-container "$APP" "$DOCKER_ARGS") + declare -a ARG_ARRAY + eval "ARG_ARRAY=($DOCKER_ARGS)" + cid=$(fn-scheduler-docker-local-start-app-container "$APP" "${ARG_ARRAY[@]}") plugn trigger post-container-create "app" "$cid" "$APP" "deploy" "$PROC_TYPE" "$DOCKER_BIN" container start "$cid" >/dev/null || true diff --git a/plugins/scheduler-docker-local/scheduler-run b/plugins/scheduler-docker-local/scheduler-run index eb0239834..2c926a6a5 100755 --- a/plugins/scheduler-docker-local/scheduler-run +++ b/plugins/scheduler-docker-local/scheduler-run @@ -14,12 +14,12 @@ trigger-scheduler-docker-local-scheduler-run() { declare RUN_ENV=("${@:1:ENV_COUNT}") shift "$ENV_COUNT" + declare RUN_COMMAND=("$@") if [[ "$DOKKU_SCHEDULER" != "docker-local" ]]; then return fi - local DOCKER_RUN_LABEL_ARGS="--label=com.dokku.app-name=$APP" local IMAGE_TAG=$(get_running_image_tag "$APP") local IMAGE=$(get_deploying_app_image_name "$APP" "$IMAGE_TAG") @@ -44,13 +44,13 @@ trigger-scheduler-docker-local-scheduler-run() { DOCKER_ARGS+=$(: | plugn trigger docker-args-process-run "$APP" "$IMAGE_SOURCE_TYPE" "$IMAGE_TAG") DOCKER_ARGS+=" -e DYNO=$PROCESS_TYPE.$DYNO_NUMBER --name $APP.$PROCESS_TYPE.$DYNO_NUMBER" - declare -a ARG_ARRAY - eval "ARG_ARRAY=($DOCKER_ARGS)" - if [[ "$DOKKU_RM_CONTAINER" ]]; then DOCKER_ARGS+=" --rm" fi - has_tty && DOCKER_ARGS+=" --interactive --tty" + if has_tty; then + DOCKER_ARGS+=" --interactive" + DOCKER_ARGS+=" --tty" + fi for env_pair in "${RUN_ENV[@]}"; do DOCKER_ARGS+=" --env=$env_pair" done @@ -76,13 +76,34 @@ trigger-scheduler-docker-local-scheduler-run() { fi # shellcheck disable=SC2124 - DOCKER_ARGS+=" --label=com.dokku.container-type=$PROCESS_TYPE ${DOCKER_RUN_LABEL_ARGS[@]} $DOKKU_GLOBAL_RUN_ARGS" - DOCKER_ARGS+=" $IMAGE " - DOCKER_ARGS+=" $EXEC_CMD " - # shellcheck disable=SC2124 - DOCKER_ARGS+=" $@" + DOCKER_ARGS+=" --label=com.dokku.container-type=$PROCESS_TYPE" + DOCKER_ARGS+=" --label=com.dokku.app-name=$APP" + # $DOKKU_GLOBAL_RUN_ARGS" + DOCKER_ARGS+=" $IMAGE" + DOCKER_ARGS+=" $EXEC_CMD" - CONTAINER_ID=$(fn-scheduler-docker-local-start-app-container "$APP" "$DOCKER_ARGS") + declare -a ARG_ARRAY + eval "ARG_ARRAY=($DOCKER_ARGS)" + + if [[ "${#RUN_COMMAND[@]}" -eq 0 ]]; then + if [[ -z "$DOKKU_SHELL" ]]; then + local DOKKU_APP_SHELL=$(config_get "$APP" DOKKU_APP_SHELL || true) + local DOKKU_GLOBAL_SHELL=$(config_get --global DOKKU_APP_SHELL || true) + local DOKKU_SHELL=${DOKKU_APP_SHELL:="$DOKKU_GLOBAL_SHELL"} + fi + + if [[ -z "$DOKKU_SHELL" ]]; then + DOKKU_SHELL="/bin/bash" + fi + 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[@]}") plugn trigger post-container-create "app" "$CONTAINER_ID" "$APP" "run" declare -a DOCKER_START_ARGS_ARRAY From 6f2c218f29f92c2f59f020842f8a9c2689d176bc Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sun, 3 Oct 2021 19:47:54 -0400 Subject: [PATCH 2/7] chore: fix shfmt issue --- plugins/scheduler-docker-local/internal-functions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scheduler-docker-local/internal-functions b/plugins/scheduler-docker-local/internal-functions index 69ac7aa0c..a46914632 100755 --- a/plugins/scheduler-docker-local/internal-functions +++ b/plugins/scheduler-docker-local/internal-functions @@ -243,6 +243,6 @@ fn-scheduler-docker-local-start-app-container() { declare DOCKER_ARGS=("$@") eval "$(config_export app "$APP" --merged)" - # shellcheck disable=SC2124 + # shellcheck disable=SC2124 "$DOCKER_BIN" container create ${DOCKER_ARGS[@]} } From c266d8c41e3b79bf4b1ea7135fe28e221bc61192 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sun, 3 Oct 2021 20:08:56 -0400 Subject: [PATCH 3/7] chore: ignore shellcheck issues --- plugins/scheduler-docker-local/scheduler-run | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/scheduler-docker-local/scheduler-run b/plugins/scheduler-docker-local/scheduler-run index 2c926a6a5..373c8c76a 100755 --- a/plugins/scheduler-docker-local/scheduler-run +++ b/plugins/scheduler-docker-local/scheduler-run @@ -95,8 +95,10 @@ trigger-scheduler-docker-local-scheduler-run() { if [[ -z "$DOKKU_SHELL" ]]; then DOKKU_SHELL="/bin/bash" fi + # shellcheck disable=SC2206 ARG_ARRAY=(${ARG_ARRAY[@]} "$DOKKU_SHELL") else + # shellcheck disable=SC2206 ARG_ARRAY=(${ARG_ARRAY[@]} "${RUN_COMMAND[@]}") # for run_arg in "${RUN_COMMAND[@]}"; do # DOCKER_ARGS+=" ${run_arg} " From 3d239344fee36cd80d4d1898ebd7d73f38106208 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sun, 3 Oct 2021 20:09:16 -0400 Subject: [PATCH 4/7] refactor: use eval set hack to preserve whitespace --- plugins/scheduler-docker-local/internal-functions | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/plugins/scheduler-docker-local/internal-functions b/plugins/scheduler-docker-local/internal-functions index a46914632..e3f0e403d 100755 --- a/plugins/scheduler-docker-local/internal-functions +++ b/plugins/scheduler-docker-local/internal-functions @@ -240,9 +240,14 @@ fn-scheduler-docker-local-start-app-container() { declare desc="starts a single app container" declare APP="$1" shift - declare DOCKER_ARGS=("$@") + + local DOCKER_ARGS + for i in "$@"; do + DOCKER_ARGS="$DOCKER_ARGS \"$i\"" + done + eval set -- $DOCKER_ARGS eval "$(config_export app "$APP" --merged)" # shellcheck disable=SC2124 - "$DOCKER_BIN" container create ${DOCKER_ARGS[@]} + "$DOCKER_BIN" container create "$@" } From 1d1cf566926cea0fe455033a3029a6845630625a Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sun, 3 Oct 2021 22:31:05 -0400 Subject: [PATCH 5/7] fix: run shfmt --- plugins/scheduler-docker-local/internal-functions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scheduler-docker-local/internal-functions b/plugins/scheduler-docker-local/internal-functions index e3f0e403d..d7bea8da4 100755 --- a/plugins/scheduler-docker-local/internal-functions +++ b/plugins/scheduler-docker-local/internal-functions @@ -243,7 +243,7 @@ fn-scheduler-docker-local-start-app-container() { local DOCKER_ARGS for i in "$@"; do - DOCKER_ARGS="$DOCKER_ARGS \"$i\"" + DOCKER_ARGS="$DOCKER_ARGS \"$i\"" done eval set -- $DOCKER_ARGS From e636609fa83dc0378d997b040805aca354b8c842 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sun, 3 Oct 2021 22:42:06 -0400 Subject: [PATCH 6/7] fix: declare RUN_COMMAND after all other argument parsing has been performed If it is declared sooner, the transformation of the command to the Procfile entry will be ignored. --- plugins/scheduler-docker-local/scheduler-run | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/scheduler-docker-local/scheduler-run b/plugins/scheduler-docker-local/scheduler-run index 373c8c76a..5be3b6445 100755 --- a/plugins/scheduler-docker-local/scheduler-run +++ b/plugins/scheduler-docker-local/scheduler-run @@ -14,7 +14,7 @@ trigger-scheduler-docker-local-scheduler-run() { declare RUN_ENV=("${@:1:ENV_COUNT}") shift "$ENV_COUNT" - declare RUN_COMMAND=("$@") + declare RUN_COMMAND=() if [[ "$DOKKU_SCHEDULER" != "docker-local" ]]; then return @@ -85,6 +85,7 @@ trigger-scheduler-docker-local-scheduler-run() { declare -a ARG_ARRAY eval "ARG_ARRAY=($DOCKER_ARGS)" + RUN_COMMAND=("$@") if [[ "${#RUN_COMMAND[@]}" -eq 0 ]]; then if [[ -z "$DOKKU_SHELL" ]]; then local DOKKU_APP_SHELL=$(config_get "$APP" DOKKU_APP_SHELL || true) From a4be3a06f91f92c7b79b0c97719fca943dec0e57 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sun, 3 Oct 2021 22:56:25 -0400 Subject: [PATCH 7/7] fix: properly quote arguments so that they preserve whitespace --- plugins/scheduler-docker-local/scheduler-run | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/plugins/scheduler-docker-local/scheduler-run b/plugins/scheduler-docker-local/scheduler-run index 5be3b6445..78d062cfc 100755 --- a/plugins/scheduler-docker-local/scheduler-run +++ b/plugins/scheduler-docker-local/scheduler-run @@ -96,11 +96,9 @@ trigger-scheduler-docker-local-scheduler-run() { if [[ -z "$DOKKU_SHELL" ]]; then DOKKU_SHELL="/bin/bash" fi - # shellcheck disable=SC2206 - ARG_ARRAY=(${ARG_ARRAY[@]} "$DOKKU_SHELL") + ARG_ARRAY=("${ARG_ARRAY[@]}" "$DOKKU_SHELL") else - # shellcheck disable=SC2206 - ARG_ARRAY=(${ARG_ARRAY[@]} "${RUN_COMMAND[@]}") + ARG_ARRAY=("${ARG_ARRAY[@]}" "${RUN_COMMAND[@]}") # for run_arg in "${RUN_COMMAND[@]}"; do # DOCKER_ARGS+=" ${run_arg} " # done