Last active
March 26, 2019 19:32
-
-
Save strund3r/5f13b82c812f151b6dbe9db64a4e1061 to your computer and use it in GitHub Desktop.
Docker Swarm deploy script (using AWS CLI) (Docker 4 AWS)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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