Skip to content

Instantly share code, notes, and snippets.

@Cdaprod
Last active July 24, 2025 17:58
Show Gist options
  • Save Cdaprod/b4d9167deaa015c2e0105af180c27528 to your computer and use it in GitHub Desktop.
Save Cdaprod/b4d9167deaa015c2e0105af180c27528 to your computer and use it in GitHub Desktop.
Docker Exec Selector & Functioning Alias
##### dce example output #####
## Select a service:
## 1) video-api
## 2) video-web
## ?# 1
## Connecting to service: video-api
##############################
unalias dce
# V1: Docker Compose Exec with built-in service selectiondce() {
# Check if docker-compose.yml exists
if [[ ! -f "docker-compose.yaml" && ! -f "compose.yaml" ]]; then
echo "Error: No docker-compose.yml or compose.yml found in current directory"
return 1
fi
# Get list of services
local services=($(docker-compose ps --services 2>/dev/null))
if [[ ${#services[@]} -eq 0 ]]; then
echo "Error: No services found"
return 1
elif [[ ${#services[@]} -eq 1 ]]; then
# Only one service, use it directly
echo "Connecting to service: ${services[1]}"
docker-compose exec "${services[1]}" "${@:-bash}"
else
# Multiple services, show selection menu
echo "Select a service:"
select service in "${services[@]}"; do
if [[ -n "$service" ]]; then
echo "Connecting to service: $service"
docker-compose exec "$service" "${@:-bash}"
break
else
echo "Invalid selection. Please try again."
fi
done
fi}
##### `dce example interface` #####
## Docker Compose Services:
## ========================
## → video-api
## video-web
## Use ↑/↓ arrows (or j/k) to navigate, Enter to select, q to quit
###################################
# Ensure `dce` isn't already aliased
unalias dce
# V2: Interactive Docker Compose Exec with arrow key selection
dce() {
# Check if docker-compose files exist (check .yaml first, then .yml)
if [[ ! -f "docker-compose.yaml" && ! -f "compose.yaml" && ! -f "docker-compose.yml" && ! -f "compose.yml" ]]; then
echo "Error: No docker-compose.yaml/yml or compose.yaml/yml found in current directory"
return 1
fi
# Get list of services
local services=($(docker-compose ps --services 2>/dev/null))
if [[ ${#services[@]} -eq 0 ]]; then
echo "Error: No services found"
return 1
elif [[ ${#services[@]} -eq 1 ]]; then
echo "Connecting to service: ${services[1]}"
_dce_exec "${services[1]}" "$@"
else
# Multiple services, show interactive arrow key selection
_dce_select_service "$@"
fi
}
# Interactive service selection with arrow keys
_dce_select_service() {
local services=($(docker-compose ps --services 2>/dev/null))
local selected=1
local total=${#services[@]}
# Function to display menu
_display_menu() {
clear
echo "Docker Compose Services:"
echo "========================"
for i in {1..$total}; do
if [[ $i -eq $selected ]]; then
echo "→ ${services[$i]}"
else
echo " ${services[$i]}"
fi
done
echo ""
echo "Use ↑/↓ arrows (or j/k) to navigate, Enter to select, q to quit"
}
# Initial display
_display_menu
# Read key input
while true; do
read -k key
case $key in
# Up arrow or k
$'\e[A'|'k')
((selected > 1)) && ((selected--))
_display_menu
;;
# Down arrow or j
$'\e[B'|'j')
((selected < total)) && ((selected++))
_display_menu
;;
# Enter
$'\n')
clear
echo "Connecting to service: ${services[$selected]}"
_dce_exec "${services[$selected]}" "$@"
break
;;
# Number keys (1-9) for quick selection
[1-9])
if [[ $key -le $total ]]; then
selected=$key
clear
echo "Connecting to service: ${services[$selected]}"
_dce_exec "${services[$selected]}" "$@"
break
fi
;;
# Quit
'q'|'Q'|$'\e')
clear
echo "Cancelled"
return 0
;;
esac
done
}
# Helper function to execute with shell fallback
_dce_exec() {
local service="$1"
shift
if [[ $# -gt 0 ]]; then
# User provided a specific command
docker-compose exec "$service" "$@"
else
# Try bash first, fallback to sh
echo "Trying bash shell..."
if ! docker-compose exec "$service" bash 2>/dev/null; then
echo "Bash not available, trying sh..."
docker-compose exec "$service" sh
fi
fi
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment