scinote-web/wmake-main.sh
2016-07-21 13:11:15 +02:00

327 lines
11 KiB
Bash

#!/bin/bash
set -e
###################################
# VARIABLES
###################################
IMAGE_NAME="railsdocker_web"
PG_IMAGE_NAME="postgres:9.4"
WEB_CONTAINER="web"
DB_CONTAINER="db"
DBDATA_CONTAINER="dbdata"
WIN_HOST_RAILS_WS=$PWD
WIN_HOST_DB_TEST="$PWD/db/test.dump"
WIN_HOST_DB_DEV="$PWD/db/development.dump"
CONTAINER_MOUNT_WS="//tmp//app"
CONTAINER_RAILS_WS_PARENT="//usr//src//"
CONTAINER_RAILS_WS="//usr//src//app"
PORT=3000
###################################
# Show help etc.
PROCEED=0
if [ $# -eq 0 ]; then
echo "Invalid arguments. Call '$FILENAME help' for more info."
elif [ $1 == "help" ]; then
echo "Usage: $FILENAME COMMAND/S"
echo ""
echo "Windows Boot2Docker helper script. If starting from scratch, the following order of commands should be used to get you started: docker, setup, build."
echo ""
echo "Commands:"
echo " $FILENAME help Prints out the help contents"
echo ""
echo " $FILENAME bash Starts the bash console on host computer with Docker environment configured"
echo ""
echo " $FILENAME docker Creates the Docker image from the Dockerfile"
echo ""
echo " $FILENAME data Initializes the data persistent container"
echo ""
echo " $FILENAME run Starts the Rails server in the configured Docker container"
echo ""
echo " $FILENAME cli Starts the bash console in the configured Docker container"
echo " (with unison syncing which means a bit slower startup, but faster command execution)"
echo ""
echo " $FILENAME cli active Connects to the bash console in the already running Docker container"
echo ""
echo " $FILENAME cli nosync Starts the bash console in the configured Docker container"
echo " (without database container running)"
echo " (without Unison syncing, fast startup but horrendously slow command execution)"
echo ""
echo " $FILENAME cli nodb Starts the bash console in the configured Docker container"
echo " (without database container running)"
echo " (with unison syncing which means a bit slower startup, but faster command execution)"
echo ""
echo " $FILENAME db-cli Starts the bash console in the configured database Docker container"
echo ""
echo " $FILENAME db-cli active Connects to the bash console in the already running database Docker container"
echo ""
echo " $FILENAME psql Connects to the database of the running database Docker container"
echo ""
echo " $FILENAME pgdump Dumps the database contents of the running database Docker container into dump files on the host"
echo ""
echo " $FILENAME pgrestore Restores the database contents of the dump files on host into the Docker container"
echo ""
echo " $FILENAME clean Removes the Docker image (this will also remove the downloaded packages)"
echo ""
echo " $FILENAME cclean Removes all the stopped Docker containers (cleans up some disk space)"
else
PROCEED=1
fi
# Only continue if not help...
if [ $PROCEED -eq 1 ]; then
cd "$B2D_HOME"
# Copy of Boot2Docker start.sh from here on
# clear the MSYS MOTD
cd "$(dirname "$BASH_SOURCE")"
ISO="$HOME/.boot2docker/boot2docker.iso"
if [ ! -e "$ISO" ]; then
echo 'copying initial boot2docker.iso (run "boot2docker.exe download" to update)'
mkdir -p "$(dirname "$ISO")"
cp ./boot2docker.iso "$ISO"
fi
echo 'initializing...'
./boot2docker.exe init
echo
echo 'starting...'
./boot2docker.exe start
echo
echo 'IP address of docker VM:'
./boot2docker.exe ip
B2D_IP="$(./boot2docker.exe ip)"
echo
echo 'setting environment variables ...'
./boot2docker.exe shellinit | sed 's,\\,\\\\,g' # eval swallows single backslashes in windows style path
eval "$(./boot2docker.exe shellinit 2>/dev/null | sed 's,\\,\\\\,g')"
echo
# Modification of original code
cd "$VBOX_HOME"
echo "$VBOX_HOME"
set +e
"$VBOX_HOME/"VBoxManage controlvm boot2docker-vm natpf1 delete "rails-server"
set -e
"$VBOX_HOME/"VBoxManage controlvm boot2docker-vm natpf1 "rails-server,tcp,127.0.0.1,$PORT,,$PORT"
cd "$B2D_HOME"
echo 'You can now use `docker` directly, or `boot2docker ssh` to log into the VM.'
# End of copy Boot2Docker start.sh
if [ $1 == "bash" ]; then
exec "$BASH" --login -i
elif [ $1 == "docker" ]; then
exec "$BASH" --login -i -c "\
cd $WIN_HOST_RAILS_WS\
;docker pull $PG_IMAGE_NAME\
;docker build -t $IMAGE_NAME .\
;docker rm $WEB_CONTAINER\
;docker rm $DB_CONTAINER"
elif [ $1 == "data" ]; then
exec "$BASH" --login -i -c "\
docker create \
-v //var//lib//postgres \
--name $DBDATA_CONTAINER \
$PG_IMAGE_NAME \
//bin//true"
elif [ $1 == "run" ]; then
exec "$BASH" --login -i -c "\
docker kill $WEB_CONTAINER\
;docker rm $WEB_CONTAINER\
;docker kill $DB_CONTAINER\
;docker rm $DB_CONTAINER\
;docker run \
--rm \
--name $DB_CONTAINER \
--volumes-from $DBDATA_CONTAINER \
-p 5432:5432 \
$PG_IMAGE_NAME \
& (sleep 10\
;docker run \
--rm \
--name $WEB_CONTAINER \
--link $DB_CONTAINER:db \
-ti \
-v $WIN_HOST_RAILS_WS:$CONTAINER_MOUNT_WS \
-w $CONTAINER_MOUNT_WS \
-p $PORT:$PORT \
-u 'root' \
$IMAGE_NAME \
//bin//bash -l -c '\
rm -r tmp/pids/server.pid\
;export PATH=/usr/local/bundle/bin:\$PATH\
;cp -rf $CONTAINER_MOUNT_WS// $CONTAINER_RAILS_WS_PARENT\
;chmod -R 777 $CONTAINER_MOUNT_WS\
;chmod -R 777 $CONTAINER_RAILS_WS\
;unison \
$CONTAINER_MOUNT_WS \
$CONTAINER_RAILS_WS \
-perms 0 \
-ignorecase false \
-links false \
-ignoreinodenumbers \
-auto \
-silent \
-ignore \"Path vendor/bundle\" \
-ignore \"Path .git\" \
-ignore \"Path .bundle\" \
-repeat 1 \
> /dev/null \
& chmod -R 777 $CONTAINER_RAILS_WS\
;cd $CONTAINER_RAILS_WS\
;rails server -b 0.0.0.0 -p $PORT')"
elif [[ ( $1 == "cli" ) && ( $2 == "active" ) ]]; then
exec "$BASH" --login -i -c "\
docker exec \
-ti \
$WEB_CONTAINER \
//bin//bash -l"
elif [[ ( $1 == "cli" ) && ( $2 == "nosync" ) ]]; then
exec "$BASH" --login -i -c "\
docker kill $WEB_CONTAINER\
;docker rm $WEB_CONTAINER\
;docker run \
--rm \
--name $WEB_CONTAINER \
-ti \
-v $WIN_HOST_RAILS_WS:$CONTAINER_RAILS_WS \
-w $CONTAINER_RAILS_WS \
-p $PORT:$PORT \
$IMAGE_NAME \
//bin//bash -l"
elif [[ ( $1 == "cli" ) && ( $2 == "nodb" ) ]]; then
exec "$BASH" --login -i -c "
docker kill $WEB_CONTAINER\
;docker rm $WEB_CONTAINER\
;docker run \
--rm \
--name $WEB_CONTAINER \
-ti \
-v $WIN_HOST_RAILS_WS:$CONTAINER_MOUNT_WS \
-w $CONTAINER_MOUNT_WS \
-u 'root' \
$IMAGE_NAME //bin//bash -l -c '\
rm -r tmp/pids/server.pid\
;export PATH=/usr/local/bundle/bin:\$PATH\
;cp -rf $CONTAINER_MOUNT_WS// $CONTAINER_RAILS_WS_PARENT\
;chmod -R 777 $CONTAINER_MOUNT_WS\
;chmod -R 777 $CONTAINER_RAILS_WS\
;unison \
$CONTAINER_MOUNT_WS \
$CONTAINER_RAILS_WS \
-perms 0 \
-ignorecase false \
-links false \
-ignoreinodenumbers \
-auto \
-silent \
-ignore \"Path vendor/bundle\" \
-ignore \"Path .git\" \
-ignore \"Path .bundle\" \
-repeat 1 \
> /dev/null \
& chmod -R 777 $CONTAINER_RAILS_WS\
;cd $CONTAINER_RAILS_WS\
;//bin//bash'"
elif [ $1 == "cli" ]; then
exec "$BASH" --login -i -c "
docker kill $WEB_CONTAINER\
;docker rm $WEB_CONTAINER\
;docker kill $DB_CONTAINER\
;docker rm $DB_CONTAINER\
;docker run \
--rm \
--name $DB_CONTAINER \
--volumes-from $DBDATA_CONTAINER \
-p 5432:5432 \
$PG_IMAGE_NAME \
> /dev/null \
& (sleep 10\
;docker run \
--rm \
--name $WEB_CONTAINER \
--link $DB_CONTAINER:db \
-ti \
-v $WIN_HOST_RAILS_WS:$CONTAINER_MOUNT_WS \
-w $CONTAINER_MOUNT_WS \
-u 'root' \
$IMAGE_NAME //bin//bash -l -c '\
rm -r tmp/pids/server.pid\
;export PATH=/usr/local/bundle/bin:\$PATH\
;cp -rf $CONTAINER_MOUNT_WS// $CONTAINER_RAILS_WS_PARENT\
;chmod -R 777 $CONTAINER_MOUNT_WS\
;chmod -R 777 $CONTAINER_RAILS_WS\
;unison \
$CONTAINER_MOUNT_WS \
$CONTAINER_RAILS_WS \
-perms 0 \
-ignorecase false \
-links false \
-ignoreinodenumbers \
-auto \
-silent \
-ignore \"Path vendor/bundle\" \
-ignore \"Path .git\" \
-ignore \"Path .bundle\" \
-repeat 1 \
> /dev/null \
& chmod -R 777 $CONTAINER_RAILS_WS\
;cd $CONTAINER_RAILS_WS\
;//bin//bash')"
elif [[ ( $1 == "db-cli" ) && ( $2 == "active" ) ]]; then
exec "$BASH" --login -i -c "\
docker exec \
-ti \
$DB_CONTAINER \
//bin//bash -l"
elif [ $1 == "db-cli" ]; then
exec "$BASH" --login -i -c "\
docker kill $DB_CONTAINER\
;docker rm $DB_CONTAINER\
;docker run \
--rm \
--name $DB_CONTAINER \
-ti \
--volumes-from $DBDATA_CONTAINER \
-p 5432:5432 \
$PG_IMAGE_NAME \
//bin//bash -l"
elif [ $1 == "psql" ]; then
eval "'$PSQL_BIN/psql' -h $B2D_IP -p 5432 -U postgres"
elif [ $1 == "pgdump" ]; then
eval "'$PSQL_BIN/pg_dump' -h $B2D_IP -p 5432 -U postgres -f '$WIN_HOST_DB_TEST' -O -c -C scinote_test"
eval "'$PSQL_BIN/pg_dump' -h $B2D_IP -p 5432 -U postgres -f '$WIN_HOST_DB_DEV' -O -c -C scinote_development"
elif [ $1 == "pgrestore" ]; then
eval "'$PSQL_BIN/psql' -h $B2D_IP -p 5432 -U postgres -f '$WIN_HOST_DB_TEST' -d scinote_test"
eval "'$PSQL_BIN/psql' -h $B2D_IP -p 5432 -U postgres -f '$WIN_HOST_DB_DEV' -d scinote_development"
elif [ $1 == "clean" ]; then
exec "$BASH" --login -i -c "\
docker rmi -f $IMAGE_NAME\
;docker rmi -f $PG_IMAGE_NAME"
elif [ $1 == "cclean" ]; then
exec "$BASH" --login -i -c "\
docker rm $(docker ps -a -q)"
fi
fi
unset IMAGE_NAME
unset PG_IMAGE_NAME
unset WEB_CONTAINER
unset DB_CONTAINER
unset WIN_HOST_RAILS_WS
unset WIN_HOST_DB_TEST
unset WIN_HOST_DB_DEV
unset CONTAINER_RAILS_WS
unset PORT
unset B2D_IP
unset PROCEED