Docker image for building statically linked Linux binaries from Rust projects.
From inside your project directoring containing a Cargo.toml
file:
# Stable release channel:
docker run -v "$PWD":/build fredrikfornwall/rust-static-builder
# Nightly release channel:
docker run -v "$PWD":/build fredrikfornwall/rust-static-builder-nightly
A statically linked binary will be created under target/x86_64-unknown-linux-musl/release/
.
To speed up builds the cargo registry and git folders can be mounted:
docker run \
-v "$PWD":/build \
-v $HOME/.cargo/git:/root/.cargo/git \
-v $HOME/.cargo/registry:/root/.cargo/registry \
fredrikfornwall/rust-static-builder
Override the entry point to run tests against the statically linked binary:
docker run \
-v "$PWD":/build \
-v $HOME/.cargo/git:/root/.cargo/git \
-v $HOME/.cargo/registry:/root/.cargo/registry \
--entrypoint cargo \
fredrikfornwall/rust-static-builder \
test --target x86_64-unknown-linux-musl
By default the built binary will be stripped. Run with -e NOSTRIP=1
, as in
docker run \
-e NOSTRIP=1 \
-v "$PWD":/build \
fredrikfornwall/rust-static-builder
to disable stripping.
The built binary can be used to create a lightweight Docker image built from scratch:
FROM scratch
COPY target/x86_64-unknown-linux-musl/release/my-executable /
ENTRYPOINT ["/my-executable"]
The rust-static-builder image contains statically libraries for the following images in order for crates to be able to link them in:
- liblzma
- openssl
- sqlite
- zlib
Note that if the projects needs certificates for OpenSSL a base image containing /cacert.pem can be used when building a Docker image:
FROM fredrikfornwall/scratch-with-certificates
COPY target/x86_64-unknown-linux-musl/release/tls-using-executable /
ENTRYPOINT ["/tls-using-executable"]