Skip to content

Instantly share code, notes, and snippets.

@strund3r
Last active March 26, 2019 19:32
Show Gist options
  • Save strund3r/5f13b82c812f151b6dbe9db64a4e1061 to your computer and use it in GitHub Desktop.
Save strund3r/5f13b82c812f151b6dbe9db64a4e1061 to your computer and use it in GitHub Desktop.
Docker Swarm deploy script (using AWS CLI) (Docker 4 AWS)
#!/bin/bash
################ VARIABLES ################
# Image Repository #
image_name="example/example" #
# #
# .pem key's location #
ssh_key_loc="/home/example/example.pem" #
################ VARIABLES ################
# TAG/VERSION
printf "\nEnter the image's tag/version: "
read tag
# SELECT DOCKERFILE
echo -e "\n###########################################################"
# Set the prompt for the select command
PS3=$'\n''Select option: '
# Create a list of files to display
file_list=$(find Dockerfile* -maxdepth 1 -type f)
echo -e "\nSelect which Dockerfile you want to use:\n"
select file_name in ${file_list};
do
if [ -n "${file_name}" ]; then
echo -e "\nYou've selected ${file_name}"
fi
break
done
# INSTALL PYTHON, PIP, AWS_CLI
echo -e "
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ @
@ INSTALLING DEPENDENCIES @
@ @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
sudo apt-get -y install jq python python-pip python-virtualenv -qq && pip install awscli
pip install --upgrade awscli
aws --version
# CONFIGURE AWS_CLI
echo -e "
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ @
@ CONFIGURING AWS @
@ @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
aws configure set default.region us-east-1
aws configure set default.output json
# BUILD IMAGE
echo -e "
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ @
@ BUILDING IMAGE @
@ @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
time docker build -f ${file_name} -t ${image_name}:latest .
# TAG IMAGE
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#@ @
#@ TAGGING IMAGE @
#@ @
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
docker tag ${image_name}:latest ${image_name}:${tag}
# PUSH IMAGE TO DOCKERHUB
echo -e "
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ @
@ PUSHING IMAGE TO DOCKERHUB @
@ @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
time docker push ${image_name}:${tag}
time docker push ${image_name}:latest
# DEPLOY AWS
echo -e "
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ @
@ DEPLOYING SERVICES TO AWS @
@ @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
# ALL THE CREDIT FOR THE FOLLOWING CONNECTION PART OF THIS SCRIPT GOES TO @hairyhenderson
# Generates random filenames for the SSH configuration and the SSH control socket, not entirely necessary ;)
export _sshconfig=$(mktemp -u)
export _ssh_ctrl_socket=$(mktemp -u)
cfn_stack_name=<stack-name>
jqScript=".AutoScalingGroups[] | select(.Tags[].Value == \"${cfn_stack_name}-Manager\").Instances[] | select(.HealthStatus == \"Healthy\").InstanceId"
manager_id=$(aws autoscaling describe-auto-scaling-groups | jq -r "${jqScript}" | head -n1)
manager=$(aws ec2 describe-instances --instance-ids ${manager_id} | jq -r '.Reservations[].Instances[].PublicDnsName')
cat <<EOF > ${_sshconfig}
User docker
LogLevel error
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
IdentityFile ${ssh_key}
ControlPath ${_ssh_ctrl_socket}
EOF
chmod 400 ${ssh_key_loc}
ssh-add ${ssh_key_loc}
# Set up an SSH control socket for tunneling, so that we can cleanly close it when we're done
ssh -M -F ${_sshconfig} \
-fnNT -L localhost:2374:/var/run/docker.sock ${manager}
# configure all `docker` commands to communicate through the SSH tunnel instead of any local docker engine
export DOCKER_HOST=localhost:2374
# now run `docker` commands as normal, use --with-registry-auth flag if pulling image from private registry:
docker stack deploy --with-registry-auth -c <docker-compose-file>.yml <service-stack-name>
# Close the tunnel
ssh -F ${_sshconfig} -O exit -
# remove the temporary SSH-related files
rm -f ${_ssh_ctrl_socket}
unset DOCKER_HOST
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment