Sign inSign up

x1unix/go-mingw

By x1unix

•Updated about 1 month ago

Docker image for building Go binaries for Windows. Supports Windows on ARM!

Image
Languages & frameworks
Developer tools
2

10K+

x1unix/go-mingw repository overview

⁠go-mingw

Docker Hub Docker Hub GitHub

Docker image for building Go binaries for Windows 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!

⁠Supported Architectures

Here is a list of supported host and target architectures:

Host ArchitectureWin x86Win x86-64Win on Arm
arm64 / aarch64✅✅✅
amd64✅✅✅

⁠Usage

You can pull Docker image with desired Go version from Docker Hub:

docker pull x1unix/go-mingw:latest # or "1.21" for specific Go version

Tip

Please take a look at [examples](https://github.com/x1unix/docker-go-mingw/blob/master/example) before starting to work.
⁠Building Go applications inside container

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.

⁠Windows On Arm

Set GOARCH=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 .
⁠For 32-bit toolchain

To build a 32-bit executable, set GOARCH=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 examples [here](https://github.com/x1unix/docker-go-mingw/blob/master/example).
⁠Go linker flags override

Go linker and compiler flags can be specified using container environment variables via -e option.

Example:

docker exec -it
    -e LDFLAGS="-linkmode external -extldflags '-static -s -w'"
    ...
⁠Output files ownership

By default, Go container starts as a root user. It means, that all produced files will be owned by root:root user.

To set files to be owned by your current user by default, start the container with your current uid/gid.

Use -u flag to start container with different user/group id.

# Start container as other uid/gid
docker exec --rm -it -u "$UID:$GID" ...

Important

For non-root container user, it is recommended to mount your host GOPATH and GOCACHE.
⁠Go Build Cache

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 volume
docker volume create go-cache

# Run container with attached volume
docker 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

See [Docker volumes docs](https://docs.docker.com/storage/volumes/) for more info.
⁠Go modules cache

In addition to Go build cache, you may also want to mount Go modules cache to avoid modules re-download on each build.

To do this, mount your GOPATH or Go modules directory ($GOPATH/pkg).

⁠Building custom Docker image

Docker image can be rebuilt locally with a desired Go version:

make image GO_VERSION=1.20

Important

Replace `1.20` with desired Go version.

⁠Credits

Tag summary

Content type

Image

Digest

sha256:ab6730ffa…

Size

950 MB

Last updated

about 1 month ago

docker pull x1unix/go-mingw