# get ports from nginx proxy function _ports(){ grep -E "set .port|server_name" /app/nginxproxy/data/nginx/proxy_host/*.conf \ | sed 's/^[ \t]*//; s/.*conf://' \ | paste - - \ | sed 's/set \$port //; s/server_name //; s/;//g' \ | awk '{$1=$1; print}' \ | sort -n \ | column -t -N "PORT,TARGET,OTHER_TARGET" -W "OTHER_TARGET" -s ' ' -o ' | '; } alias nginx='_ports' # tmp rebuild for hugo development alias hugo-rebuild='rm -rf public/ && hugo server --appendPort=false --baseURL="/" --ignoreCache' # helpers for quickly editing aliases alias src='source ~/.bash_aliases' alias edit='vim /srv/configs/.bash_aliases' # Docker Image Version Tag checker function _tagger() { if [ -z "$1" ]; then echo "Usage: tag :" return 1 fi # Split image and tag safely local INPUT="$1" local REPO="${INPUT%%:*}" local TAG="${INPUT##*:}" # If no tag provided, default to latest [ "$REPO" = "$TAG" ] && TAG="latest" # Handle official library images local API_REPO="$REPO" [[ "$REPO" != *"/"* ]] && API_REPO="library/$REPO" # 1. Grab the exact unique digest for the target tag local DIGEST DIGEST=$(curl -s "https://hub.docker.com/v2/repositories/${API_REPO}/tags/${TAG}" | jq -r '.digest // empty') if [ -z "$DIGEST" ] || [ "$DIGEST" = "null" ]; then echo "Error: Image or tag not found on Docker Hub." return 1 fi # 2. Get the sibling tag sharing the same digest, skipping text labels local VERSION VERSION=$(curl -s "https://hub.docker.com/v2/repositories/${API_REPO}/tags/?page_size=100" \ | jq -r --arg dig "$DIGEST" \ '.results[] | select(.digest == $dig) | .name' \ | grep -E -v 'latest|alpine|slim|debian|bullseye|bookworm|ubuntu|test|rc|nightly' \ | head -n 1) # 3. Output results if [ -n "$VERSION" ]; then echo "${REPO}:${VERSION}" else echo "${REPO}:${TAG}" fi } alias tag='_tagger' # docker services function _docker-table() { if ! docker info > /dev/null 2>&1; then echo "Error: Docker daemon is not running." return 1 fi ( # 1. Adjusted Header to match your 3 requested columns printf "NAME|STATUS|EXPOSED PORTS\n" # 2. Match the format string to exactly what you are reading docker ps -a --format "{{.Names}}|{{.Status}}|{{.Ports}}" | while IFS='|' read -r name status ports; do if [ -n "$ports" ]; then # Split ports strictly by comma IFS=',' read -r -a port_array <<< "$ports" cleaned_ports="" for p in "${port_array[@]}"; do # Trim any leading/trailing spaces from the array element p=$(echo "$p" | xargs) # Strip everything up to and including '->' if it exists cleaned_p="${p##*->}" # Prevent duplicate listings (e.g. if IPv4 and IPv6 both map to 8080/tcp) if [[ ", $cleaned_ports, " != *", $cleaned_p, "* ]]; then if [ -z "$cleaned_ports" ]; then cleaned_ports="$cleaned_p" else cleaned_ports="$cleaned_ports, $cleaned_p" fi fi done ports="$cleaned_ports" fi # Print the 3 columns cleanly printf "%s|%s|%s\n" "$name" "$status" "$ports" done ) | column -t -s '|' } alias docker-services='_docker-table'