Sign inSign up

serpro69/google-cloud-cli

By serpro69

Updated almost 2 years ago

A custom gcloud sdk image with additional plugins.

Image
Developer tools
0

972

serpro69/google-cloud-cli repository overview

About

A custom gcloud sdk image with additional plugins.

Wait... but why?

Because I prefer to have such things run in a container, rather than installing them locally on my machine.

But while google provides a docker image for gcloud sdk, the default images lack some additional plugins that I use daily.

Thankfully, it's quite easy to install additional components.

Usage

I have a bash gcloud_wrapper function defined in my dotfiles:

➜ which gcloud_wrapper
gcloud_wrapper () {
        local docker_cmd=("docker" "run" "--rm" "-ti" "-u" "$(id -u):$(id -g)" "-v" "/etc/passwd:/etc/passwd" "-v" "${HOME}/.config/gcloud:${HOME}/.config/gcloud" "-v" "${HOME}/.kube:${HOME}/.kube" "-v" "$(pwd):${HOME}/workdir" "-w" "${HOME}/workdir")
        local image_name="serpro69/google-cloud-cli"
        local bash_mode=false
        local args=()
        print_usage () {
                echo "Usage: gcloud_wrapper [--bash-exec] [--mount-docker] [gcloud_command [args...]]"
                echo ""
                echo "Options:"
                echo "  --bash-exec    Start an interactive bash shell inside the Docker container."
                echo "  --mount-docker Mount Docker configuration directory (\$HOME/.docker) inside the container."
                echo ""
                echo "Description:"
                echo "  This function facilitates running Google Cloud CLI commands inside a Docker container"
                echo "  using the 'serpro69/google-cloud-cli' image. It ensures necessary configurations"
                echo "  are mounted and sets a working directory inside the container. By default, it runs"
                echo "  'gcloud' commands; with '--bash-exec', it starts an interactive bash session inside"
                echo "  the container."
                echo ""
                echo "Docker Mounts:"
                echo "  - /etc/passwd:/etc/passwd                       Host's passwd file is mounted to the container."
                echo "  - \$HOME/.config/gcloud:\$HOME/.config/gcloud   Mounts gcloud configuration directory."
                echo "  - \$HOME/.kube:\$HOME/.kube                     Mounts kube configuration directory."
                echo "  - \$(pwd):\${HOME}/workdir                      Mounts current directory on host to container's workdir."
                echo ""
                echo "  - \$HOME/.docker:\${HOME}/.docker               Mounts docker configuration directory (requires '--mount-docker' option)."
                echo ""
                echo "Examples:"
                echo "  gcloud_wrapper --mount-docker auth configure-docker europe-north1-docker.pkg.dev"
                echo "    - configure docker authentication with gcloud helper"
                echo "      (see also: https://cloud.google.com/artifact-registry/docs/docker/authentication#gcloud-helper )"
                echo ""
                echo "  gcloud_wrapper --mount-docker compute instances list"
                echo "    - Runs 'gcloud compute instances list' inside the Docker container."
                echo ""
                echo "  gcloud_wrapper --bash-exec"
                echo "    - Starts an interactive bash session inside the Docker container."
                echo ""
        }
        while [[ $# -gt 0 ]]
        do
                case "$1" in
                        (--bash-exec) bash_mode=true
                                shift ;;
                        (--mount-docker) docker_cmd+=("-v" "${HOME}/.docker:${HOME}/.docker")
                                shift ;;
                        (-hh | --help-msg) print_usage
                                return 0 ;;
                        (*) args+=("$1")
                                shift ;;
                esac
        done
        if $bash_mode
        then
                "${docker_cmd[@]}" "${image_name}" "/bin/bash"
        else
                "${docker_cmd[@]}" "${image_name}" "gcloud" "${args[@]}"
        fi
}

I also have a simple "wrapper" shell script:

➜ cat ~/.local/bin/gcloud
#!/usr/bin/env bash

source ${HOME}/dotfiles/extra

gcloud_wrapper "$@"

Which I can then use as a normal gcloud executable, e.g.: gcloud config set project visit20-e2e-poc

Note

I use a bash script wrapper instead of calling the function directly because some tools require `gcloud` executable to be on the `PATH`, e.g. [docker credential helpers](https://cloud.google.com/artifact-registry/docs/docker/authentication#gcloud-helper)

I also have a gcloud-init function that helps me set things up on first run:

➜ which gcloud-init
gcloud-init () {
        if [ ! -d "$HOME/.config/gcloud" ]
        then
                mkdir -p "$HOME/.config/gcloud"
        fi
        if [[ "$*" == *"--help"* ]]
        then
                echo "Initialize gcloud to be used via docker"
                return 0
        fi
        docker run --rm -ti -u $(id -u):$(id -g) -v /etc/passwd:/etc/passwd -v $HOME/.config/gcloud:$HOME/.config/gcloud serpro69/google-cloud-cli gcloud init
}

Tags

Image tags correspond to a hash of a git commit from which the given image was built. These tags are immutable.

latest tag, on the other hand, is mutable and would rarely point to the latest commit tag. latest will often diverge, e.g. when the docker image is re-built to use latest version of base image, or upgrade additional components.

Build and Publish

  • make build
  • make publish

Meta

Github repo: https://github.com/serpro69/docker-gcloud-cli

Tag summary

Content type

Image

Digest

sha256:64cdd3a3a

Size

1.1 GB

Last updated

almost 2 years ago

docker pull serpro69/google-cloud-cli