Skip to content

Instantly share code, notes, and snippets.

@cmizzi
Last active January 29, 2019 13:51
Show Gist options
  • Select an option

  • Save cmizzi/c23d87eb4eb978ab7b102df9503bc258 to your computer and use it in GitHub Desktop.

Select an option

Save cmizzi/c23d87eb4eb978ab7b102df9503bc258 to your computer and use it in GitHub Desktop.
Add `dockershell` command to get logged in container (service or container)
dockershell() {
if [ "$1" = "service" ]; then
ID=$(docker inspect --format '{{.Status.ContainerStatus.ContainerID}}' $(docker service ps -q "$2" | head -1))
else
ID=$2
fi;
docker exec -t -i -e PS1="$ID:\w# " "$ID" bash --noprofile --norc
}
__dockershell() {
local state
_arguments \
"1: :->kind" \
"*: :->containers" \
case $state in
(kind) compadd "$@" service container ;;
(*)
if [ "$words[2]" = "service" ]; then
_arguments "*:services:($((docker info 2> /dev/null | grep -i 'swarm: active') && docker service ls -q --format '{{.Name}}'))"
else
_arguments "*:containers:($(docker ps -q --format '{{.Names}}'))"
fi;
;;
esac
}
compdef __dockershell dockershell
@drasill
Copy link

drasill commented Sep 17, 2018

An addition :

dockershell() {

        if [ "$1" = "service" ]; then
                ID=$(docker inspect --format '{{.Status.ContainerStatus.ContainerID}}' $(docker service ps -q "$2" | head -1))
        else
                ID=$2
        fi;

        shift 2
        if [[ "$#" -lt 1 ]]; then
            ARGS="bash"
        else
            ARGS=("$@")
        fi

        docker exec -t -i "$ID" "${ARGS[@]}"
}

@drasill
Copy link

drasill commented Jan 29, 2019

A new version with "servicelike" to use service name when not in a swarm manager :

# vim:syn=zsh

dockershell() {
        if [ "$1" = "service" ]; then
                ID=$(docker inspect --format '{{.Status.ContainerStatus.ContainerID}}' $(docker service ps -q "$2" | head -1))
        elif [ "$1" = "servicelike" ]; then
                ID=$(docker ps --format '{{.Names}}' | sort -n | grep "^$2\.")
                echo "Found ID=$ID for $2"
        else
                ID=$2
        fi;

        shift 2
        if [[ "$#" -lt 1 ]]; then
            ARGS="bash"
        else
            ARGS=("$@")
        fi

        docker exec -t -i "$ID" "${ARGS[@]}"
}

__dockershell() {
        local state

        _arguments \
                "1: :->kind" \
                "*: :->containers" \

        case $state in
                (kind) compadd "$@" service servicelike container ;;
                (*)
                        if [ "$words[2]" = "service" ]; then
                                _arguments "*:services:($((docker info 2> /dev/null | grep -i 'swarm: active') && docker service ls -q --format '{{.Name}}'))"
                        elif [ "$words[2]" = "servicelike" ]; then
                                _arguments "*:services:($(docker ps --format '{{.Names}}' | cut -d. -f1 | sort | uniq))"
                        else
                                _arguments "*:containers:($(docker ps -q --format '{{.Names}}'))"
                        fi;
                ;;
        esac
}

compdef __dockershell dockershell

alias dkse='dockershell service'
alias dksle='dockershell servicelike'


######### 

dockerlogs() {
        if [ "$1" = "service" ]; then
                docker service logs -f --tail 100 $2
                exit 0
        fi;

        docker logs -f --tail 100 $2
}

__dockerlogs() {
        local state

        _arguments \
                "1: :->kind" \
                "*: :->containers" \

        case $state in
                (kind) compadd "$@" service container ;;
                (*)
                        if [ "$words[2]" = "service" ]; then
                                _arguments "*:services:($((docker info 2> /dev/null | grep -i 'swarm: active') && docker service ls -q --format '{{.Name}}'))"
                        else
                                _arguments "*:containers:($(docker ps -q --format '{{.Names}}'))"
                        fi;
                ;;
        esac
}

compdef __dockerlogs dockerlogs

alias dksl='dockerlogs service'
alias dksll='dockerlogs servicelike'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment