MS SQL Server¶
Since v0.27.0
Introduction¶
The Testcontainers module for MS SQL Server.
Adding this module to your project dependencies¶
Please run the following command to add the MS SQL Server module to your Go dependencies:
go get github.com/testcontainers/testcontainers-go/modules/mssql
Info
To use this module with Go 1.23+, set GODEBUG=x509negativeserial=1. See the related issue in the mssql-docker repository for details.
# append to any existing GODEBUG flags instead of overwriting
export GODEBUG="${GODEBUG:+$GODEBUG,}x509negativeserial=1"
This occurs because:
- Go 1.23+ has stricter certificate validation that rejects certificates with negative serial numbers by default
- The x509negativeserial=1 flag temporarily re‑enables acceptance of such certificates
Note: This stricter check in Go 1.23+ is a security hardening. Prefer using images with fixed certificates (see below). Use the GODEBUG workaround only with affected images and in test environments.
Info
This is fixed in SQL2019 CU32 and SQL2022 CU18 (see SQL Server 2022 CU18 — KB 3867855).
Prefer using container images based on these (or newer) CUs to avoid setting GODEBUG.
Usage example¶
ctx := context.Background()
password := "SuperStrong@Passw0rd"
mssqlContainer, err := mssql.Run(ctx,
"mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04",
mssql.WithAcceptEULA(),
mssql.WithPassword(password),
)
defer func() {
if err := testcontainers.TerminateContainer(mssqlContainer); err != nil {
log.Printf("failed to terminate container: %s", err)
}
}()
if err != nil {
log.Printf("failed to start container: %s", err)
return
}
EULA Acceptance
Due to licensing restrictions you are required to explicitly accept an End User License Agreement (EULA) for the MS SQL Server container image. This is facilitated through the WithAcceptEULA function.
Please see the microsoft-mssql-server image documentation for a link to the EULA document.
Module Reference¶
Run function¶
- Since v0.32.0
Info
The RunContainer(ctx, opts...) function is deprecated and will be removed in the next major release of Testcontainers for Go.
The MS SQL Server module exposes one entrypoint function to create the MS SQL Server container, and this function receives three parameters:
func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*MSSQLServerContainer, error)
context.Context, the Go context.string, the Docker image to use.testcontainers.ContainerCustomizer, a variadic argument for passing options.
Image¶
Use the second argument in the Run function to set a valid Docker image.
In example: Run(context.Background(), "mcr.microsoft.com/mssql/server:2022-RTM-GDR1-ubuntu-20.04").
Container Options¶
When starting the MS SQL Server container, you can pass options in a variadic way to configure it.
WithInitSQL¶
- Since v0.36.0
If you need to execute SQL files when the container starts, you can use mssql.WithInitSQL(files
...io.Reader) with one or more *.sql files. The files will be executed in order after the
container is ready.
CREATE SCHEMA pizza_palace;
GO
CREATE TABLE pizza_palace.pizzas (
ID INT PRIMARY KEY IDENTITY,
ToppingName NVARCHAR(100),
Deliciousness NVARCHAR(100) UNIQUE
);
GO
INSERT INTO pizza_palace.pizzas (ToppingName, Deliciousness) VALUES
('Pineapple', 'Controversial but tasty'),
('Pepperoni', 'Classic never fails')
GO
This will:
- Copy each file into the container.
- Execute them using
sqlcmdafter the container is ready.
WithAcceptEula¶
- Since v0.27.0
Due to licensing restrictions you are required to explicitly accept an EULA for this container image. To do so, you must use the function mssql.WithAcceptEula(). Failure to include this will result in the container failing to start.
WithPassword¶
- Since v0.27.0
If you need to set a different MS SQL Server password, you can use mssql.WithPassword with a valid password for MS SQL Server. E.g. mssql.WithPassword("SuperStrong@Passw0rd").
Info
If you set a custom password string, it must adhere to the MS SQL Server Password Policy.
The following options are exposed by the testcontainers package.
Basic Options¶
WithExposedPortsSince v0.37.0WithEnvSince v0.29.0WithWaitStrategySince v0.20.0WithAdditionalWaitStrategySince v0.38.0WithWaitStrategyAndDeadlineSince v0.20.0WithAdditionalWaitStrategyAndDeadlineSince v0.38.0WithEntrypointSince v0.37.0WithEntrypointArgsSince v0.37.0WithCmdSince v0.37.0WithCmdArgsSince v0.37.0WithLabelsSince v0.37.0
Lifecycle Options¶
WithLifecycleHooksSince v0.38.0WithAdditionalLifecycleHooksSince v0.38.0WithStartupCommandSince v0.25.0WithAfterReadyCommandSince v0.28.0
Files & Mounts Options¶
WithFilesSince v0.37.0WithMountsSince v0.37.0WithTmpfsSince v0.37.0WithImageMountSince v0.37.0
Build Options¶
WithDockerfileSince v0.37.0
Logging Options¶
WithLogConsumersSince v0.28.0WithLogConsumerConfigSince v0.38.0WithLoggerSince v0.29.0
Image Options¶
WithAlwaysPullSince v0.38.0WithImageSubstitutorsSince v0.26.0WithImagePlatformSince v0.38.0
Networking Options¶
WithNetworkSince v0.27.0WithNetworkByNameSince v0.38.0WithBridgeNetworkSince v0.38.0WithNewNetworkSince v0.27.0
Advanced Options¶
WithHostPortAccessSince v0.31.0WithConfigModifierSince v0.20.0WithHostConfigModifierSince v0.20.0WithEndpointSettingsModifierSince v0.20.0CustomizeRequestSince v0.20.0WithNameSince v0.38.0WithNoStartSince v0.38.0WithProviderSince v0.39.0
Experimental Options¶
WithReuseByNameSince v0.37.0
Container Methods¶
The MS SQL Server container exposes the following methods:
ConnectionString¶
- Since v0.27.0
This method returns the connection string to connect to the Microsoft SQL Server container, using the default 1433 port.
It's possible to pass extra parameters to the connection string, e.g. encrypt=false or TrustServerCertificate=true, in a variadic way.
connectionString, err := container.ConnectionString(ctx, "encrypt=false", "TrustServerCertificate=true")