#!/bin/bash PROGRAM_NAME=""$(basename "$0") if [ -z "$STACK_NAME" ] || [ -z "$STACK_NAME" ]; then echo "ERROR: STACK_NAME must be set (e.g. export STACK_NAME=my_cool_app)" exit fi sub_help(){ echo "Usage: $PROGRAM_NAME [options]" echo "" echo "Subcommands:" echo " service_run SERVICE [CMD] run a command in the specified service's container" echo " secret_generate SECRET VERSION [CMD] generate a secret, store it in pass & as a Docker secret" echo " deploy [COMPOSE_FILE] let 'em rip" echo " logs SERVICE tail logs from a deployed service" echo "" echo "Make sure \$STACK_NAME is set (probably using direnv)" } sub_secret_generate(){ SECRET=$1 VERSION=$2 PW=${3:-pwqgen} if [ -z "$SECRET" ] || [ -z "$VERSION" ]; then echo "Usage: $PROGRAM_NAME secret_generate SECRET VERSION" exit fi $PW | tee \ >(docker secret create "${STACK_NAME}_${SECRET}_${VERSION}" -) \ >(pass insert "hosts/autonomic-swarm/${STACK_NAME}/${SECRET}" -m) } sub_service_run(){ SERVICE=$1 SH=${2:-/bin/sh} CONTAINER=$(docker container ls --format "table {{.ID}},{{.Names}}" \ | grep "${STACK_NAME}_${SERVICE}" | cut -d',' -f1) if [ -z "$CONTAINER" ]; then echo "Container not found! 🚨" exit fi docker exec -it "$CONTAINER" "$SH" } sub_deploy (){ COMPOSE=${1:-compose.yml} echo "About to deploy:" echo "Compose: $(tput setaf 3)${PWD}/${COMPOSE}$(tput sgr0)" echo "Domain: $(tput setaf 2)${DOMAIN}$(tput sgr0)" echo "Stack: $(tput setaf 1)${STACK_NAME}$(tput sgr0)" read -rp "Continue? (y/[n])? " choice case "$choice" in y|Y ) ;; n|N ) return;; * ) return;; esac docker stack deploy -c "$COMPOSE" "$STACK_NAME" } sub_logs (){ SERVICE=$1 docker service logs "${STACK_NAME}_${SERVICE}" \ --follow \ --no-trunc \ --details \ --timestamps } subcommand=$1 case $subcommand in "" | "-h" | "--help") sub_help ;; *) shift "sub_${subcommand}" "$@" if [ $? = 127 ]; then echo "Error: '$subcommand' is not a known subcommand." >&2 echo " Run '$PROGRAM_NAME --help' for a list of known subcommands." >&2 exit 1 fi ;; esac