A Docker image that combines Microsoft SQL Server command-line tools with PowerShell, enabling you to run SQL operations and PowerShell scripts in a single containerized environment.
Built on top of mcr.microsoft.com/mssql-tools:latest, this image includes:
- sqlcmd - SQL Server command-line utility
- bcp - Bulk copy program utility
- PowerShell 7+ - Cross-platform PowerShell
- Execute SQL scripts using sqlcmd from PowerShell
- Run database migrations and deployments
- Automate database operations in CI/CD pipelines
- Perform bulk data operations with bcp
- Combine SQL operations with PowerShell scripting logic
- Docker Desktop installed on Windows
- Access to a SQL Server instance (local or remote)
docker pull cilerler/microsoft-mssql-tools:latestdocker run -it --rm cilerler/microsoft-mssql-tools:latest pwshOnce inside the container, you can use sqlcmd:
sqlcmd -S your-server.database.windows.net -U your-username -P your-password -d your-database -Q "SELECT @@VERSION"docker run --rm cilerler/microsoft-mssql-tools:latest pwsh -Command `
"sqlcmd -S 'your-server' -U 'your-username' -P 'your-password' -d 'your-database' -Q 'SELECT GETDATE()'"First, mount your local directory containing the SQL script:
docker run --rm -v ${PWD}:/scripts cilerler/microsoft-mssql-tools:latest pwsh -Command `
"sqlcmd -S 'your-server' -U 'your-username' -P 'your-password' -d 'your-database' -i /scripts/your-script.sql"docker run --rm `
-e SQL_SERVER='your-server' `
-e SQL_USER='your-username' `
-e SQL_PASSWORD='your-password' `
-e SQL_DATABASE='your-database' `
cilerler/microsoft-mssql-tools:latest pwsh -Command `
"sqlcmd -S `$env:SQL_SERVER -U `$env:SQL_USER -P `$env:SQL_PASSWORD -d `$env:SQL_DATABASE -Q 'SELECT DB_NAME()'"Create a PowerShell script (db-operations.ps1):
# db-operations.ps1
$server = $env:SQL_SERVER
$user = $env:SQL_USER
$password = $env:SQL_PASSWORD
$database = $env:SQL_DATABASE
Write-Host "Connecting to $server..."
$result = sqlcmd -S $server -U $user -P $password -d $database -Q "SELECT COUNT(*) FROM sys.tables" -h -1
Write-Host "Number of tables: $result"Run it:
docker run --rm `
-v ${PWD}:/scripts `
-e SQL_SERVER='your-server' `
-e SQL_USER='your-username' `
-e SQL_PASSWORD='your-password' `
-e SQL_DATABASE='your-database' `
cilerler/microsoft-mssql-tools:latest pwsh /scripts/db-operations.ps1Export data to a file:
docker run --rm -v ${PWD}:/data cilerler/microsoft-mssql-tools:latest pwsh -Command `
"bcp 'SELECT * FROM YourTable' queryout /data/output.dat -S 'your-server' -U 'your-username' -P 'your-password' -d 'your-database' -c"Import data from a file:
docker run --rm -v ${PWD}:/data cilerler/microsoft-mssql-tools:latest pwsh -Command `
"bcp YourTable in /data/input.dat -S 'your-server' -U 'your-username' -P 'your-password' -d 'your-database' -c"If you're running SQL Server locally on Windows and want to connect from the container:
# Use host.docker.internal to reference the Windows host
docker run --rm cilerler/microsoft-mssql-tools:latest pwsh -Command `
"sqlcmd -S 'host.docker.internal' -U 'sa' -P 'YourPassword' -Q 'SELECT @@SERVERNAME'"If SQL Server is running in a Docker container:
# Create a network
docker network create sql-network
# Run SQL Server (example)
docker run -d --name sqlserver --network sql-network `
-e "ACCEPT_EULA=Y" -e "SA_PASSWORD=YourStrong@Password" `
mcr.microsoft.com/mssql/server:2022-latest
# Run mssql-tools container on the same network
docker run --rm --network sql-network cilerler/microsoft-mssql-tools:latest pwsh -Command `
"sqlcmd -S 'sqlserver' -U 'sa' -P 'YourStrong@Password' -Q 'SELECT @@VERSION'"Create a docker-compose.yml:
version: '3.8'
services:
sqlserver:
image: mcr.microsoft.com/mssql/server:2022-latest
environment:
ACCEPT_EULA: "Y"
SA_PASSWORD: "YourStrong@Password"
ports:
- "1433:1433"
sql-tools:
image: cilerler/microsoft-mssql-tools:latest
depends_on:
- sqlserver
environment:
SQL_SERVER: sqlserver
SQL_USER: sa
SQL_PASSWORD: "YourStrong@Password"
SQL_DATABASE: master
volumes:
- ./scripts:/scripts
command: pwsh -Command "Start-Sleep -Seconds 10; sqlcmd -S $$env:SQL_SERVER -U $$env:SQL_USER -P $$env:SQL_PASSWORD -i /scripts/init.sql"Run with:
docker-compose upsteps:
- task: Docker@2
displayName: 'Run Database Migration'
inputs:
command: 'run'
arguments: >
--rm
-v $(Build.SourcesDirectory)/database:/scripts
-e SQL_SERVER=$(SqlServer)
-e SQL_USER=$(SqlUser)
-e SQL_PASSWORD=$(SqlPassword)
-e SQL_DATABASE=$(SqlDatabase)
cilerler/microsoft-mssql-tools:latest
pwsh /scripts/migrate.ps1- name: Run Database Scripts
run: |
docker run --rm `
-v ${{ github.workspace }}/database:/scripts `
-e SQL_SERVER=${{ secrets.SQL_SERVER }} `
-e SQL_USER=${{ secrets.SQL_USER }} `
-e SQL_PASSWORD=${{ secrets.SQL_PASSWORD }} `
-e SQL_DATABASE=${{ secrets.SQL_DATABASE }} `
cilerler/microsoft-mssql-tools:latest `
pwsh /scripts/deploy.ps1
shell: pwshYou can extend this image or install the SqlServer module at runtime:
docker run -it --rm cilerler/microsoft-mssql-tools:latest pwsh -Command `
"Install-Module -Name SqlServer -Force -AllowClobber; Import-Module SqlServer; Invoke-Sqlcmd -ServerInstance 'your-server' -Username 'your-username' -Password 'your-password' -Query 'SELECT @@VERSION'"# check-database.ps1
$ErrorActionPreference = "Stop"
try {
$result = sqlcmd -S $env:SQL_SERVER -U $env:SQL_USER -P $env:SQL_PASSWORD -Q "SELECT 1" -h -1
if ($LASTEXITCODE -eq 0) {
Write-Host "Connection successful!"
exit 0
} else {
Write-Error "Connection failed with exit code: $LASTEXITCODE"
exit 1
}
} catch {
Write-Error "Error: $_"
exit 1
}-S- Server name or IP address-U- Username (SQL Server authentication)-P- Password (SQL Server authentication)-E- Use Windows authentication (not applicable in Linux container)-d- Database name-Q- Execute query and exit-i- Input file (SQL script)-o- Output file-h -1- Remove headers from output-s- Column separator-W- Remove trailing spaces-C- Trust server certificate (for encrypted connections)
Never hardcode passwords in scripts or command history. Use environment variables or secure secret management:
# Read from environment
$password = $env:SQL_PASSWORD
# Or use Docker secrets in Swarm mode
docker run --rm `
--secret sql-password `
cilerler/microsoft-mssql-tools:latest pwsh -Command `
"sqlcmd -S 'your-server' -U 'your-username' -P (Get-Content /run/secrets/sql-password) -Q 'SELECT 1'"If you're having trouble connecting, verify the connection string:
docker run --rm cilerler/microsoft-mssql-tools:latest pwsh -Command `
"sqlcmd -S 'your-server' -U 'your-username' -P 'your-password' -Q 'SELECT 1' -C"Add -C to trust the server certificate if using encrypted connections.
docker run --rm cilerler/microsoft-mssql-tools:latest pwsh -Command `
"sqlcmd -?; Write-Host '---'; pwsh --version"If you want to build this image locally:
# Clone or create the Dockerfile
docker build -t cilerler/microsoft-mssql-tools:latest .This image is based on Microsoft's official SQL Server tools image. Please refer to Microsoft's licensing terms for sqlcmd and bcp utilities.
Issues and pull requests are welcome for improving this image and documentation.