Run Go tests inside a Docker image.
go install mvdan.cc/dockexec@latest
go test -exec='dockexec postgres:12.1'
You can also use custom flags for docker run
, as well as any test flags:
go test -exec='dockexec [docker flags] image:tag' [test flags]
go run
is also supported:
go run -exec='dockexec postgres:12.1' .
The goal is to easily test many packages with specific Docker images, without having to write the boilerplate code yourself. All previous alternatives weren't any good:
- Running
go test
insidedocker run
requires your Go version to be installed in the image. - Running
go test -c
and running the test binary underdocker run
is tedious, error-prone, and doesn't scale to many packages.
-
go test
without package arguments runs tests with access to the current terminal. However,go test -exec="dockexec $image"
will not, asdockexec
cannot distinguish this mode from others likego test -exec="dockexec $image" ./...
. If you want access to the terminal, supply the-t
docker flag. -
Docker images are assumed to be unix-like at the moment, and only Linux images are tested. Other platforms like Windows-native images may be supported in the future.
-
Beware that the Docker image may not have compatible C libraries, given the default of
CGO_ENABLED=1
. If you run into "no such file" exec errors, or glibc version mismatch errors, you should consider disabling cgo viaCGO_ENABLED=0
or a fully static build.