Deployment Automatization for docker builds, kubernetes deploys and secret injection
Some suggestions in rough order of decreasing importance:


eval is evil, and I'm pretty sure you can completely avoid it in your script. Other than a massive gain in sanity, all that sed stuff to escape strings is not going to be necessary if you instead just use plain shell.
Naming is really important, and comments are a good way to detect things which should be renamed.
set -o errexit -o nounset -o pipefail would be very handy in this script. Just make sure you're aware of the caveats (that page is needlessly snarky but has some useful bits, and that site is fantastic).
A simple array is the best way to build a command. I would thoroughly recommend not building complex commands using a shell script. Instead, run each command as soon as you have all the pieces. Bundling up commands to run isn't going to make things faster; in most cases it'll make things significantly slower by making >50% of the code about building the command rather than just running it.
Nested functions aren't. There are no closures in Bash, so defining a function within another function just makes it harder to read.
In Bash the convention is that uppercase names are reserved for exported variables.
Single use variables can often be inlined without loss of clarity.
printf is meant to be used with format strings for readability. So

printf "SHA1 for ${cyan}$name${end_format} is ${yellow}$tag${end_format}.\n"


would normally be written as

printf "SHA1 for %s is %s.\n" "${cyan}${name}${end_format}" "${yellow}${tag}${end_format}"

local is considered a command for exit code purposes, which means that local foo=[variable or command substitution] only gets the exit code of local, not of the variable or command substitution. So if you start using nounset and the like you should declare variables local before assigning them separately:

deploy() {
    local deploy_name tag
    deploy_name="$1"
    tag="$2"
    …
}

shellcheck can give you more tips.