Create static Mono binaries for minimal Docker deployments
3.1K
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
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.
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
See A Nancy .NET Microservice running on Docker in under 20mb for a walkthrough.
Content type
Image
Digest
sha256:2b4af7018…
Size
152.8 MB
Last updated
over 10 years ago
docker pull mefellows/mono-static