From 0959284083a54e643155982f405b94df5da16556 Mon Sep 17 00:00:00 2001 From: Timothy Jennison Date: Mon, 30 Sep 2019 12:32:42 -0400 Subject: [PATCH] Add scripts for creating disk images --- create-image/create-docker-image.sh | 46 ++++++++++++++++++++++++++++ create-image/create-image.sh | 47 +++++++++++++++++++++++++++++ create-image/run-script.sh | 43 ++++++++++++++++++++++++++ 3 files changed, 136 insertions(+) create mode 100755 create-image/create-docker-image.sh create mode 100755 create-image/create-image.sh create mode 100644 create-image/run-script.sh diff --git a/create-image/create-docker-image.sh b/create-image/create-docker-image.sh new file mode 100755 index 0000000..31fa395 --- /dev/null +++ b/create-image/create-docker-image.sh @@ -0,0 +1,46 @@ +#!/bin/bash +set -o errexit -o pipefail -o nounset + +if [[ $# != 3 ]]; then + echo "Usage: create-docker-image.sh " + exit 1 +fi + +if [[ "${2:(-2)}" != "GB" ]] && [[ "${2:(-2)}" != "TB" ]]; then + echo "Disk size should be XXGB or XXTB" + exit 1 +fi + + +ZONE=us-central1-a +SCRIPT=$(mktemp -t "run-script-XXXXX") + +echo "VM startup script: ${SCRIPT}" +DATA=/mnt/disks/data +cat <${SCRIPT} +set -o errexit -o xtrace +sudo mkfs.ext4 -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard \ + /dev/sdb +sudo mkdir -p "${DATA}" +sudo mount -o discard,defaults /dev/sdb "${DATA}" +sudo chmod a+w "${DATA}" + +mount --bind "${DATA}" /var/lib/docker/overlay2 +mkdir "${DATA}/l" + +IFS="," +IMAGES="$1" +for IMAGE in \$IMAGES; do + docker pull "\${IMAGE}" +done + +/sbin/poweroff +EOF + +DIR="${BASH_SOURCE%/*}" +if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi +. "$DIR/run-script.sh" + +run_script "${SCRIPT}" "$2" "${ZONE}" "$3" +rm "${SCRIPT}" + diff --git a/create-image/create-image.sh b/create-image/create-image.sh new file mode 100755 index 0000000..43a3785 --- /dev/null +++ b/create-image/create-image.sh @@ -0,0 +1,47 @@ +#!/bin/bash +set -o errexit -o pipefail -o nounset + +if [[ $# != 3 ]]; then + echo "Usage: create-image.sh " + exit 1 +fi + +if [[ "${1:0:5}" != "gs://" ]]; then + echo "Source must be a Google Storage bucket" + exit 1 +fi + +if [[ "${2:(-2)}" != "GB" ]] && [[ "${2:(-2)}" != "TB" ]]; then + echo "Disk size should be XXGB or XXTB" + exit 1 +fi + +echo "Files to copy:" +gsutil ls "${1}" + +ZONE=us-central1-a +SCRIPT=$(mktemp -t "run-script-XXXXX") + +echo "VM startup script: ${SCRIPT}" +DATA=/mnt/disks/data +cat <${SCRIPT} +set -e -x +sudo mkfs.ext4 -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard \ + /dev/sdb +sudo mkdir -p "${DATA}" +sudo mount -o discard,defaults /dev/sdb "${DATA}" +sudo chmod a+w "${DATA}" + +docker run -v "${DATA}":"${DATA}" \ + google/cloud-sdk:slim gsutil cp -r "${1}" "${DATA}" + +/sbin/poweroff +EOF + +DIR="${BASH_SOURCE%/*}" +if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi +. "$DIR/run-script.sh" + +run_script "${SCRIPT}" "$2" "${ZONE}" "$3" +rm "${SCRIPT}" + diff --git a/create-image/run-script.sh b/create-image/run-script.sh new file mode 100644 index 0000000..1a6d2a5 --- /dev/null +++ b/create-image/run-script.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +####################################### +# Run a script on a VM and create a disk image. +# Arguments: +# Script to run, a path. +# Disk size to pass to GCE, a string. +# Zone to run in, a string. +# Output image name, a string. +# ####################################### +function run_script() { + local NAME=$(echo "run-script-${RANDOM}") + local DISK_NAME="${NAME}-disk" + local SCRIPT="$1" + local SIZE="$2" + local ZONE="$3" + local IMAGE="$4" + + echo "Creating instance..." + gcloud compute instances create "${NAME}" \ + --zone "${ZONE}" --image-family cos-stable --image-project cos-cloud \ + --create-disk "name=${DISK_NAME},size=${SIZE},auto-delete=yes" \ + --metadata-from-file startup-script="${SCRIPT}" + + echo -n "Waiting for VM..." + while true; do + local STATUS="$(gcloud compute instances describe ${NAME} \ + --zone ${ZONE} --format='get(status)')" + if [[ "${STATUS}" != "RUNNING" ]]; then + break + fi + sleep 10 + echo -n "." + done + echo "Done" + + echo "Creating image..." + gcloud compute images create "${IMAGE}" \ + --source-disk "${DISK_NAME}" --source-disk-zone "${ZONE}" --force + + echo "Deleting VM..." + gcloud compute instances delete "${NAME}" -q --zone "${ZONE}" +}