SQL Server - Docker Container

    SQL Server - Docker Container


    Article summary

    In this article, we'll be creating a docker container that automates the process of running SQL Server and restoring a database (in this case, the Adventureworks database). 

    Configure Docker Image

    Download the AdventureWorks2017 Image

    wget https://github.com/Microsoft/sql-server-samples/releases/download/adventureworks/AdventureWorks2017.bak

    Create a file 'Dockerfile'.

    # Use the official image as a parent image.
    FROM mcr.microsoft.com/mssql/server:2019-latest
    
    # Set environment variables.
    ENV ACCEPT_EULA=Y
    ENV SA_PASSWORD=YourStrong@Passw0rd
    
    # Make SQL Server scripts available to run later in the Dockerfile.
    COPY . /tmp/
    
    # Grant permissions for to our scripts to execute
    USER root
    RUN chmod +x /tmp/run-initialization.sh
    
    # Switch back to mssql user.
    USER mssql
    
    # Start as entry point.
    CMD /bin/bash ./tmp/run-initialization.sh & /opt/mssql/bin/sqlservr
    

    Next, we will need a shell script run-initialization.sh that will be used in the Dockerfile. This script will restore the Adventureworks database:

    #!/bin/bash
    
    # Start SQL Server, start the script to restore the database, and then import the /tmp/AdventureWorks2017.bak database backup
    # In the background, tail -f anything (so Docker doesn't exit)
    /opt/mssql/bin/sqlservr & /tmp/restore-database.sh & tail -f /dev/null
    

    And then we have restore-database.sh:

    #!/bin/bash
    
    # Wait for SQL Server to start up.
    echo "Waiting for SQL Server to start..."
    sleep 20s
    
    # Restore the Adventureworks database.
    /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P YourStrong@Passw0rd \
    -Q "RESTORE DATABASE [AdventureWorks] FROM DISK = N'/tmp/AdventureWorks2017.bak' WITH FILE = 1, MOVE N'AdventureWorks2017' TO N'/var/opt/mssql/data/AdventureWorks2017.mdf', MOVE N'AdventureWorks2017_Log' TO N'/var/opt/mssql/data/AdventureWorks2017_Log.ldf', NOUNLOAD, REPLACE, STATS = 5"
    

    This script waits for SQL Server to start, then restores the Adventureworks database. Make sure that AdventureWorks2017.bak is in the same directory as your Dockerfile and scripts.

    Now, build the Docker image from your Dockerfile:

    docker build -t adventureworks-image .
    

    And finally, run the Docker container:

    docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=YourStrong@Passw0rd" -p 1433:1433 --name adventureworks-container adventureworks-image
    

    With this approach, every time you start the container, it will start SQL Server and restore the Adventureworks database. Please note that replacing a password in the scripts and Dockerfile with your own strong password is required.

    Connect from Enterprise Test Data

    Assuming none of the credentials were changed you can connect to the database with the following settings.

    Server type: Database Engine

    Server name: The IP address of your Docker host and port number, in the format <host_ip>,1433

    Authentication: SQL Server Authentication

    Login: SA

    Password: Enter the password you used when creating the Docker container ("YourStrong@Passw0rd" as per the previous instructions)

    In the Enterprise Test Data instance we used the following settings for the Connection details.

    And for the Security tab.