diff --git a/plugins/common/functions b/plugins/common/functions index 56cd23c0a..a55ea466d 100755 --- a/plugins/common/functions +++ b/plugins/common/functions @@ -179,12 +179,22 @@ copy_from_image() { } get_app_container_ids() { - APP="$1" + APP="$1"; CONTAINER_TYPE="$2" verify_app_name $APP [[ -f $DOKKU_ROOT/$APP/CONTAINER ]] && DOKKU_CIDS+=$(< $DOKKU_ROOT/$APP/CONTAINER) + if [[ -n "$CONTAINER_TYPE" ]]; then + CONTAINER_PATTERN="$DOKKU_ROOT/$APP/CONTAINER.$CONTAINER_TYPE.*" + if [[ $CONTAINER_TYPE == *.* ]]; then + CONTAINER_PATTERN="$DOKKU_ROOT/$APP/CONTAINER.$CONTAINER_TYPE" + [[ ! -f $CONTAINER_PATTERN ]] && echo "" && return 0 + fi + else + CONTAINER_PATTERN="$DOKKU_ROOT/$APP/CONTAINER.*" + fi + shopt -s nullglob - for DOKKU_CID_FILE in $DOKKU_ROOT/$APP/CONTAINER.*; do + for DOKKU_CID_FILE in $CONTAINER_PATTERN; do DOKKU_CIDS+=" " DOKKU_CIDS+=$(< $DOKKU_CID_FILE) DOKKU_CIDS+=" " diff --git a/plugins/enter/commands b/plugins/enter/commands new file mode 100755 index 000000000..5f5f2d4a8 --- /dev/null +++ b/plugins/enter/commands @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +source "$(dirname "$0")/../common/functions" + +case "$1" in + enter) + APP="$2"; IMAGE="dokku/$APP"; CONTAINER_TYPE="$3" + verify_app_name "$APP" + + [[ ! -n "$3" ]] && dokku_log_fail "No container id specified" + + if [[ "$3" == "--container-id" ]]; then + [[ ! -n "$4" ]] && dokku_log_fail "No container id specified" + + DOKKU_APP_CIDS=( $(get_app_container_ids "$APP") ) + printf -- '%s\n' "${DOKKU_APP_CIDS[@]}" | grep -q -e "^$4" || dokku_log_fail "Invalid container id for app" + ID=$(printf -- '%s\n' "${DOKKU_APP_CIDS[@]}" | grep -e "^$4") + shift 4 + else + DOKKU_APP_CIDS=( $(get_app_container_ids "$APP" "$CONTAINER_TYPE") ) + ID=${DOKKU_APP_CIDS[0]} + [[ ! -n $ID ]] && dokku_log_fail "No containers found for type '$CONTAINER_TYPE'" + shift 3 + fi + + docker ps -aq --no-trunc | grep -e "^$ID" > /dev/null || dokku_log_fail "Container does not exist" + docker ps -q --no-trunc | grep -e "^$ID" > /dev/null || dokku_log_fail "Container is not running" + + EXEC_CMD="" + is_image_herokuish_based "$IMAGE" && EXEC_CMD="/exec" + docker exec -it $ID $EXEC_CMD "${@:-/bin/bash}" + ;; + + help | enter:help) + cat && cat< [ || --container-id ], Connect to a specific app container +EOF + ;; + + *) + exit "$DOKKU_NOT_IMPLEMENTED_EXIT" + ;; + +esac