diff --git a/docs/deployment/one-off-processes.md b/docs/deployment/one-off-processes.md index 29c24a09e62..befe4a02856 100644 --- a/docs/deployment/one-off-processes.md +++ b/docs/deployment/one-off-processes.md @@ -32,6 +32,15 @@ dokku --rm-container run node-js-app ls -lah dokku --rm run node-js-app ls -lah ``` +Finally, you may wish to run a container in "detached" mode via the `--detach` dokku flag. Running a process in detached mode will immediately return a `CONTAINER_ID`. It is up to the user to then further manage this container in whatever manner they see fit, as dokku will *not* automatically terminate the container. + +```shell +dokku --detach run node-js-app ls -lah +# returns the ID of the new container +``` + +> Note that you may not use the `--rm-container` or `--rm` flags when running containers in detached mode, and attempting to do so will result in the `--detach` flag being ignored. + ### Using `run` for cron tasks You can always use a one-off container to run an application task: diff --git a/plugins/00_dokku-standard/subcommands/run b/plugins/00_dokku-standard/subcommands/run index ff2ca1588da..faebb4754a4 100755 --- a/plugins/00_dokku-standard/subcommands/run +++ b/plugins/00_dokku-standard/subcommands/run @@ -20,8 +20,15 @@ dokku_run_cmd() { local DOCKER_ARGS=$(: | plugn trigger docker-args-run "$APP" "$IMAGE_TAG") [[ "$DOKKU_TRACE" ]] && local DOCKER_ARGS+=" -e TRACE=true " - [[ "$DOKKU_RM_CONTAINER" ]] && local DOKKU_RUN_OPTS="--rm" - has_tty && local DOKKU_RUN_OPTS+=" -i -t" + + local DOKKU_RUN_OPTS="" + if [[ "$DOKKU_RM_CONTAINER" ]]; then + DOKKU_RUN_OPTS+=" --rm" + elif [[ "$DOKKU_DETACH_CONTAINER" ]]; then + DOKKU_RUN_OPTS+=" --detach" + fi + + has_tty && DOKKU_RUN_OPTS+=" -i -t" is_image_herokuish_based "$IMAGE" && local EXEC_CMD="/exec" # shellcheck disable=SC2086 docker run $DOKKU_GLOBAL_RUN_ARGS $DOKKU_RUN_OPTS $DOCKER_ARGS $IMAGE $EXEC_CMD "$@" diff --git a/plugins/common/functions b/plugins/common/functions index b1ebcee7913..9852751d91e 100755 --- a/plugins/common/functions +++ b/plugins/common/functions @@ -228,6 +228,9 @@ parse_args() { --quiet) export DOKKU_QUIET_OUTPUT=1 ;; + --detach) + export DOKKU_DETACH_CONTAINER=1 + ;; --trace) export DOKKU_TRACE=1 ;; diff --git a/tests/unit/30_core_1.bats b/tests/unit/30_core_1.bats index e5b007afbb5..80d73902513 100644 --- a/tests/unit/30_core_1.bats +++ b/tests/unit/30_core_1.bats @@ -112,6 +112,27 @@ build_nginx_config() { assert_success } +@test "(core) run (detached)" { + deploy_app + + RANDOM_RUN_CID="$(dokku --detach run $TEST_APP bash)" + run bash -c "docker inspect $RANDOM_RUN_CID" + echo "output: "$output + echo "status: "$status + assert_success + + run bash -c "docker stop $RANDOM_RUN_CID" + echo "output: "$output + echo "status: "$status + assert_success + + run dokku cleanup + echo "output: "$output + echo "status: "$status + assert_success + sleep 5 # wait for dokku cleanup to happen in the background +} + @test "(core) run (with tty)" { deploy_app run /bin/bash -c "dokku run $TEST_APP ls /app/package.json"