- Notifications
You must be signed in to change notification settings - Fork7
Docker image for building Go binaries with MinGW toolchain. Supports Windows on ARM!
License
x1unix/docker-go-mingw
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Docker image for building Go binaries forWindows with MinGW-w64 toolchain based on official Go Docker image.
Image provides simple cross-compilation environment for windows 32 and 64bit builds.
Supports Windows on Arm!
Here is a list of supported host and target architectures:
Host Architecture | Win x86 | Win x86-64 | Win Arm |
---|---|---|---|
arm64 / aarch64 | ✅ | ✅ | ✅ |
amd64 | ✅ | ✅ | ✅ |
You can pull Docker image with desired Go version:
docker pull x1unix/go-mingw:latest# or "1.22" for specific Go version# Or if you prefer to use GHCR:docker pull ghcr.io/x1unix/docker-go-mingw/go-mingw:1.22
Tip
Please take a look atexamples before starting to work.
Examples for GitLab CI and GitHub Actions are availablehere
Mount directory with app source and build it:
docker run --rm -it -v /YourPackageSrc:/go/work \ -w /go/work \ x1unix/go-mingw go build.
You will get compiled Windows binary.
SetGOARCH=arm64
to build ARM Windows binary:
docker run --rm -it -e GOARCH=arm64 -v /YourPackageSrc:/go/work \ -w /go/work \ x1unix/go-mingw go build.
To build a 32-bit executable, setGOARCH=386
variable:
docker run --rm -it -e GOARCH=386 -v /YourPackageSrc:/go/work \ -w /go/work \ x1unix/go-mingw go build.
Tip
See check project build exampleshere.
Go linker and compiler flags can be specified using container environment variables via-e
option.
Example:
dockerexec -it -e LDFLAGS="-linkmode external -extldflags '-static -s -w'" ...
By default, Go container starts as aroot user. It means, that all produced fileswill be owned byroot:root
user.
To set files to be owned by your current user by default, start the container with your currentuid/gid.
Use-u
flag to start container with different user/group id.
# Start container as other uid/giddockerexec --rm -it -u"$UID:$GID" ...
Important
For non-root container user, it is recommended to mount your host GOPATH and GOCACHE.
In order to speed up build times and keep Go build cache, it is recommended to mount local Go build cache directory or create a separate Docker volume for it.
Mounting local GOPATH:
docker run --rm -it \ -u$UID \ -v /YourPackageSrc:/go/work \ -v$(go env GOCACHE):/go/cache \ -e GOCACHE=/go/cache \ -w /go/work \ x1unix/go-mingw go build.
Using Docker volume:
# Create Docker volumedocker volume create go-cache# Run container with attached volumedocker run --rm -it \ -v /YourPackageSrc:/go/work \ -v go-cache:/go/cache \ -e GOCACHE=/go/cache \ -w /go/work \ x1unix/go-mingw go build.
Tip
SeeDocker volumes docs for more info.
In addition to Go build cache, you may also want to mount Go modules cacheto avoid modules re-download on each build.
To do this, mount your GOPATH or Go modules directory ($GOPATH/pkg
).
Docker image can be rebuilt locally with a desired Go version:
make image GO_VERSION=1.20
Important
Replace1.20
with desired Go version.
- llvm-mingw for Windows on Arm support.
- mingw-w64 - for Windows on x86 and amd64 support.
- The Go maintainers.
About
Docker image for building Go binaries with MinGW toolchain. Supports Windows on ARM!