Sign inSign up

mefellows/mono-static

By mefellows

Updated over 10 years ago

Create static Mono binaries for minimal Docker deployments

Image
0

3.1K

mefellows/mono-static repository overview

Mono Static

This image contains the full Mono development environment and a gcc environment, which can be used to create a statically compiled Mono binary.

As part of the build, it expects a build.sh to be present in the working directory to compile the app.

An example buildi-app.sh file:

#!/bin/bash

# This is used from the CI image to compile and build the app into a static binary.
nuget restore -NonInteractive

PACKAGES_DIR=$(find /usr/src/app/source/packages/ -name *.dll)
PACKAGES=""

for f in $PACKAGES_DIR; do
   PACKAGES="$PACKAGES $f"
done

echo "Found packages: ${PACKAGES}"
xbuild /p:Configuration=Release /property:OutDir=/usr/src/app/build/ ./console.sln
mkbundle --deps --static ./obj/x86/Release/console.exe $PACKAGES -o consoleapp
Usage

This image uses the ONBUILD Docker feature which is great for use as an intermediate / CI container to produce your static artifacts for use in smaller containers.

Create your CI

Assuming you have the build-app.sh from above in the root dir, you can now build an intermediate image containing your app:

Dockerfile

FROM mefellows/mono-static

MAINTAINER Matt Fellows <[email protected]>

ONBUILD WORKDIR /usr/src/app/build
CMD [ "sleep", "600" ]

This will produce a container with a compiled binary in the /usr/src/app/build directory with the name consoleapp. Extract the binary from the container for embedding into a smaller runtime container, such as busybox:

# Run the CI Build
docker build -t tmp-build .                                       

# Run the container
docker run -d --name tmp-build tmp-build                          

# This is sort of a package caching mechanism
docker cp tmp-build:/usr/src/app/source/packages .                

# Extract static binary into distribution folder
docker cp tmp-build:/usr/src/app/source/consoleapp ./distribution/

# Close off temporary container
docker rm -f tmp-build

Now create distribution\Dockerfile:

FROM progrium/busybox
RUN opkg-install libc-dev
ADD ./consoleapp console
CMD [ "./console" ]

You can build this with docker build -t mefellows/mono-api distribution

Tutorial

See A Nancy .NET Microservice running on Docker in under 20mb for a walkthrough.

Tag summary

Content type

Image

Digest

sha256:2b4af7018

Size

152.8 MB

Last updated

over 10 years ago

docker pull mefellows/mono-static