One of the key components of our Docker dev sandboxes is the database. The majority of our applications use SqlServer, and having each developer being able to spin up their own SqlServer instance and be able to work away without fear of breaking things for others is key. With Docker we have become used to being able to tear down the database and create a fresh instance inside 20 seconds. This has changed the way that we develop and our database creation (refresh dev) and upgrade scripts (that are applied to test / prod envs) are easy to test and therefore easily kept in sync. The sacrifices to the release gods ahead of upgrading test / productions systems seem a long time ago!
Where am I going with all this?! Docker is something that I’ve started taking for granted. After upgrading my home setup to an Apple M1 Studio, I was looking forward to the bump in processing power and being able to make it my primary development machine outside of the office.
Picture my happy little face as I kicked off the build scripts to rebuild my dev environment:
- Background scheduler built and launched inside .net6 linux container
- Web application built and launched inside a .net 6 linux container
- Database image pulled down and the image built…
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
Can’t be terminal surely!?
A quick, come lengthy google search and hours of reading through github issues confirms that SqlServer is not supported on Apple Silicon.
There were lots of helpful suggestions that we cut across to use Azure Sql-Edge instead as this works on Apple Silicon. Alas this is not feasible.
- All of our applications/products run on full fat azure Sql Server
- All of our local development environments are fully scripted and use full fat sql server
This means that we depend on scripts like this one and sqlcmd which isnt available in azure-sql-edge…
1 2 3 4 5 6 7 8 9
#run the setup script to create the DB and the schema in the DB /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P !Shhhh123 -d master -i dev-db.sql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P !Shhhh123 -d dev-db -i setup-dev-db.sql echo "Created a dev bragi meta DB shell (tables and sprocs) + bare minimum settings and config." # Seed the DB with some sample content from seeker echo "Loading: Seed the test data" /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P !Shhhh123 -d dev-db -i ./test-data/TestData.sql
Set up Docker desktop
- Settings => General Use Virtualis
- Settings => Features in development Use Rosetta for x86/amd64 emulation on Apple Silicon
With these two settings you will be able to run docker images.
docker run --platform=linux/amd64 --name MySqlServer -e ACCEPT_EULA=1 -e MSSQL_SA_PASSWORD=Shhhh123 -p 11433:1433 -d mcr.microsoft.com/mssql/server:2022-latest
Docker compose still failing?
When launching containers via Docker compose then you will still encounter the same
The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) error message.
✔ Volume "bragidev_mssqlbragidatabase" Created 0.0s ✔ Container bragidev-bragi-db-1 Started 0.2s ! bragi-db The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested 0.0s
This continues to fail as the
--platform argument is not being set and it will instead be arm64 (M1). You can change this by setting the
DOCKER_DEFAULT_PLATFORM environment variable.
Once this has been set then you can
docker-compose up and your sqlServer container will fire up!
Right, let’s see what these Apple Silicon chips are capable of!