I'm a .NET Core developer and I mostly work on a Mac. Before docker and containers, this would have been hard to do. But now there are containers for SQL Server, the Azure Storage emulator, and the CosmosDb emulator. Developing on a Mac is easy now. And developing on a Mac makes it easy to deploy to Linux-based servers and Linux-based Azure resources.
When I'm doing development, I almost always want all three of these containers running. I got tired of manually issuing the docker commands to start and stop and update these containers so I created a bash script to control the containers.
On my machine, I've got this script saved as 'devcontainers.sh'. It takes a bunch of command line parameters:
- -a controls the action (start, stop)
- -k to kill and delete the containers
- -p to pull for updates to the containers
By default if I call "./devcontainers.sh", it'll start all three of these containers. "./devcontainers -a stop" will stop all the containers. "./devcontainers.sh -k 1 -p 1" will kill any existing instance of the container, check for updates to the container images, and start the containers.
Here's the contents of the script. Here's a link to download the script as a text file.
#!/bin/bash
ipaddr="`ifconfig | grep "inet " | grep -Fv 127.0.0.1 | awk '{print $2}' | head -n 1`"
killAndResetContainers="0";
pullContainers="0";
action="start";
containerNameSqlServer="sqlserver";
containerNameAzureStorage="azurestorage";
containerNameCosmos="cosmosdb";
while getopts a:k:p: flag
do
case "${flag}" in
a) action=${OPTARG};;
k) killAndResetContainers=${OPTARG};;
p) pullContainers=${OPTARG};;
esac
done
echo " "
echo "FYI, the available script options are: "
echo " a - container action --> start|stop|none"
echo " k - kill and reset containers --> 0|1"
echo " p - pull containers for updated versions --> 0|1"
echo " "
if [ "$killAndResetContainers" != "1" ]; then
echo "***** NOT KILLING AND RESETTING CONTAINERS *****"
else
echo "***** KILLING AND RESETTING CONTAINERS *****"
docker stop $containerNameAzureStorage || true && docker rm $containerNameAzureStorage || true
docker stop $containerNameSqlServer || true && docker rm $containerNameSqlServer || true
docker stop $containerNameCosmos || true && docker rm $containerNameCosmos || true
fi
if [ "$pullContainers" != "1" ]; then
echo "***** NOT PULLING CONTAINERS *****"
else
echo "***** PULLING CONTAINERS *****"
docker pull mcr.microsoft.com/azure-storage/azurite
docker pull mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator
docker pull mcr.microsoft.com/mssql/server:2019-latest
fi
if [ "$action" == "start" ]; then
echo "***** STARTING CONTAINERS *****"
if [ "$(docker ps -q -f name=$containerNameAzureStorage -f status=exited)" ]; then
echo "***** resuming $containerNameAzureStorage *****"
docker start $containerNameAzureStorage
elif [ "$(docker ps -q -f name=$containerNameAzureStorage -f status=running)" ]; then
echo "***** container for $containerNameAzureStorage already running *****"
else
echo "***** starting new instance of $containerNameAzureStorage *****"
docker run --name $containerNameAzureStorage -p 10000:10000 -p 10001:10001 -d mcr.microsoft.com/azure-storage/azurite
fi
if [ "$(docker ps -q -f name=$containerNameCosmos -f status=exited)" ]; then
echo "***** resuming $containerNameCosmos *****"
docker start $containerNameCosmos
elif [ "$(docker ps -q -f name=$containerNameCosmos -f status=running)" ]; then
echo "***** container for $containerNameCosmos already running *****"
else
echo "***** starting new instance of $containerNameCosmos *****"
docker run -p 8081:8081 -p 10251:10251 -p 10252:10252 -p 10253:10253 -p 10254:10254 -m 3g --cpus=2.0 --name $containerNameCosmos -e AZURE_COSMOS_EMULATOR_PARTITION_COUNT=10 -e AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE=true -e AZURE_COSMOS_EMULATOR_IP_ADDRESS_OVERRIDE=$ipaddr -d mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator
fi
if [ "$(docker ps -q -f name=$containerNameSqlServer -f status=exited)" ]; then
echo "***** resuming $containerNameSqlServer *****"
docker start $containerNameSqlServer
elif [ "$(docker ps -q -f name=$containerNameSqlServer -f status=running)" ]; then
echo "***** container for $containerNameSqlServer already running *****"
else
echo "***** starting new instance of $containerNameSqlServer *****"
docker run --name $containerNameSqlServer -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Pa$$word' -p 1433:1433 -e 'MSSQL_PID=Standard' -d mcr.microsoft.com/mssql/server:2019-latest
fi
elif [ "$action" == "stop" ]; then
echo "***** STOPPING CONTAINERS *****"
docker stop $containerNameAzureStorage || true
docker stop $containerNameSqlServer || true
docker stop $containerNameCosmos || true
else
echo "***** NOT RUNNING START OR STOP CONTAINER ACTIONS *****"
fi
I hope this is helpful.
-Ben