diff --git a/dokku b/dokku index 59b712280..c90749787 100755 --- a/dokku +++ b/dokku @@ -141,7 +141,7 @@ execute_dokku_cmd() { nginx | nginx:*) local PLUGIN_NAME=${PLUGIN_NAME/nginx/nginx-vhosts} ;; - deploy | run | cleanup | url | urls | report) + deploy | cleanup | url | urls | report) local PLUGIN_NAME="00_dokku-standard" ;; esac diff --git a/plugins/00_dokku-standard/commands b/plugins/00_dokku-standard/commands index 56b37905c..ace188e6d 100755 --- a/plugins/00_dokku-standard/commands +++ b/plugins/00_dokku-standard/commands @@ -1,11 +1,11 @@ #!/usr/bin/env bash -[[ " help help:help cleanup:help run:help url:help urls:help version:help " == *" $1 "* ]] || exit "$DOKKU_NOT_IMPLEMENTED_EXIT" +[[ " help help:help cleanup:help url:help urls:help version:help " == *" $1 "* ]] || exit "$DOKKU_NOT_IMPLEMENTED_EXIT" source "$PLUGIN_AVAILABLE_PATH/00_dokku-standard/help-functions" set -eo pipefail [[ $DOKKU_TRACE ]] && set -x case "$1" in - help | cleanup:help | run:help | url:help | urls:help | version:help) + help | cleanup:help | url:help | urls:help | version:help) cmd-standard-help "$@" ;; diff --git a/plugins/00_dokku-standard/help-functions b/plugins/00_dokku-standard/help-functions index 2c8bceef3..7f9f22b54 100755 --- a/plugins/00_dokku-standard/help-functions +++ b/plugins/00_dokku-standard/help-functions @@ -18,7 +18,6 @@ fn-help-content() { declare desc="return help content" cat <], Cleans up exited/dead Docker containers and removes dangling images - run [--env KEY=VALUE] , Run a command in a new container using the current application image url , Show the first URL for an application (compatibility) urls , Show all URLs for an application version , Print dokku's version diff --git a/plugins/run/commands b/plugins/run/commands new file mode 100755 index 000000000..3096db561 --- /dev/null +++ b/plugins/run/commands @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +[[ " help run:help " == *" $1 "* ]] || exit "$DOKKU_NOT_IMPLEMENTED_EXIT" +source "$PLUGIN_AVAILABLE_PATH/run/help-functions" +set -eo pipefail +[[ $DOKKU_TRACE ]] && set -x + +case "$1" in + help | run:help) + cmd-run-help "$@" + ;; + + *) + exit "$DOKKU_NOT_IMPLEMENTED_EXIT" + ;; + +esac diff --git a/plugins/run/help-functions b/plugins/run/help-functions new file mode 100755 index 000000000..12db5bc05 --- /dev/null +++ b/plugins/run/help-functions @@ -0,0 +1,32 @@ +#!/usr/bin/env bash +set -eo pipefail +[[ $DOKKU_TRACE ]] && set -x + +cmd-run-help() { + declare desc="help command" + declare CMD="$1" + local plugin_name="run" + local plugin_description="Run a one-off process inside a container" + + if [[ "$CMD" == "${plugin_name}:help" ]]; then + echo -e "Usage: dokku ${plugin_name}[:COMMAND]" + echo '' + echo "$plugin_description" + echo '' + echo 'Additional commands:' + fn-help-content | sort | column -c2 -t -s, + elif [[ $(ps -o command= $PPID) == *"--all"* ]]; then + fn-help-content + else + cat < , Run a command in a new container using the current application image +help_content +} diff --git a/plugins/00_dokku-standard/subcommands/run b/plugins/run/internal-functions similarity index 94% rename from plugins/00_dokku-standard/subcommands/run rename to plugins/run/internal-functions index 0cfd97888..814ce6cf5 100755 --- a/plugins/00_dokku-standard/subcommands/run +++ b/plugins/run/internal-functions @@ -1,12 +1,11 @@ #!/usr/bin/env bash set -eo pipefail -[[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" +[[ $DOKKU_TRACE ]] && set -x + +fn-run() { + declare desc="runs command in container" -cmd-run() { - declare desc="runs command in container based on app image" - declare cmd="run" - [[ "$1" == "$cmd" ]] && shift 1 declare APP="" local SCHEDULER_ID declare -a RUN_ENV @@ -53,4 +52,10 @@ cmd-run() { DOKKU_CRON_ID="$CRON_ID" plugn trigger scheduler-run "$DOKKU_SCHEDULER" "$APP" "${#RUN_ENV[@]}" "${RUN_ENV[@]}" "$@" } -cmd-run "$@" +cmd-run() { + declare desc="runs command in container based on app image" + declare cmd="run" + [[ "$1" == "$cmd" ]] && shift 1 + + fn-run "$@" +} diff --git a/plugins/run/plugin.toml b/plugins/run/plugin.toml new file mode 100644 index 000000000..3ded5e429 --- /dev/null +++ b/plugins/run/plugin.toml @@ -0,0 +1,4 @@ +[plugin] +description = "dokku core run plugin" +version = "0.24.10" +[plugin.config] diff --git a/plugins/run/subcommands/default b/plugins/run/subcommands/default new file mode 100755 index 000000000..66d4a5dd7 --- /dev/null +++ b/plugins/run/subcommands/default @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +set -eo pipefail +source "$PLUGIN_AVAILABLE_PATH/run/internal-functions" +[[ $DOKKU_TRACE ]] && set -x + +cmd-run "$@" diff --git a/tests/unit/core_2.bats b/tests/unit/core_2.bats index 57dfe1fad..ab699655d 100644 --- a/tests/unit/core_2.bats +++ b/tests/unit/core_2.bats @@ -20,26 +20,6 @@ teardown() { assert_output_contains "Cleans up exited/dead Docker containers and removes dangling image" } -@test "(core) run (with --options)" { - deploy_app - run /bin/bash -c "dokku --force --quiet run $TEST_APP python -V" - echo "output: $output" - echo "status: $status" - assert_success -} - -@test "(core) run (with --env / -e)" { - deploy_app - run /bin/bash -c "dokku run --env TEST=testvalue -e TEST2=testvalue2 $TEST_APP env | grep -E '^TEST=testvalue'" - echo "output: $output" - echo "status: $status" - - run /bin/bash -c "dokku run --env TEST=testvalue -e TEST2=testvalue2 $TEST_APP env | grep -E '^TEST2=testvalue2'" - echo "output: $output" - echo "status: $status" - assert_success -} - @test "(core) unknown command" { run /bin/bash -c "dokku fakecommand" echo "output: $output" diff --git a/tests/unit/run_1.bats b/tests/unit/run_1.bats new file mode 100644 index 000000000..7dd8fe9b2 --- /dev/null +++ b/tests/unit/run_1.bats @@ -0,0 +1,41 @@ +#!/usr/bin/env bats + +load test_helper + +setup() { + global_setup + create_app +} + +teardown() { + destroy_app + dokku config:unset --global DOKKU_RM_CONTAINER + global_teardown +} + +@test "(run) run:help" { + run /bin/bash -c "dokku run:help" + echo "output: $output" + echo "status: $status" + assert_output_contains "Run a one-off process inside a container" +} + +@test "(run) run (with --options)" { + deploy_app + run /bin/bash -c "dokku --force --quiet run $TEST_APP python -V" + echo "output: $output" + echo "status: $status" + assert_success +} + +@test "(run) run (with --env / -e)" { + deploy_app + run /bin/bash -c "dokku run --env TEST=testvalue -e TEST2=testvalue2 $TEST_APP env | grep -E '^TEST=testvalue'" + echo "output: $output" + echo "status: $status" + + run /bin/bash -c "dokku run --env TEST=testvalue -e TEST2=testvalue2 $TEST_APP env | grep -E '^TEST2=testvalue2'" + echo "output: $output" + echo "status: $status" + assert_success +} diff --git a/tests/unit/core_3.bats b/tests/unit/run_2.bats similarity index 96% rename from tests/unit/core_3.bats rename to tests/unit/run_2.bats index 66c271d3f..f063edfe5 100644 --- a/tests/unit/core_3.bats +++ b/tests/unit/run_2.bats @@ -5,14 +5,11 @@ load test_helper setup() { global_setup create_app - DOCKERFILE="$BATS_TMPDIR/Dockerfile" } teardown() { - rm -rf /home/dokku/$TEST_APP/tls destroy_app dokku config:unset --global DOKKU_RM_CONTAINER - rm -f "$DOCKERFILE" global_teardown }