Go to file
Ignacio Corderi 0f735c5c04 Add DEP_OPENSSL_INCLUDE export
OPENSSL_INCLUDE_DIR should have worked, but apparently we also need DEP_OPENSSL_INCLUDE
2016-05-18 15:05:15 -07:00
cargo-config.toml Overhaul extensively and add test script 2016-04-17 07:42:09 -04:00
Dockerfile Add DEP_OPENSSL_INCLUDE export 2016-05-18 15:05:15 -07:00
Dockerfile.example Overhaul extensively and add test script 2016-04-17 07:42:09 -04:00
LICENSE-APACHE.txt Add licenses 2016-04-17 07:45:08 -04:00
LICENSE-MIT.txt Add licenses 2016-04-17 07:45:08 -04:00
README.md Fix typo in README.md 2016-04-17 07:46:15 -04:00
sudoers Overhaul extensively and add test script 2016-04-17 07:42:09 -04:00
test-image Overhaul extensively and add test script 2016-04-17 07:42:09 -04:00

rust-musl-builder: Docker container for easily building static Rust binaries

Docker Image

Do you want to compile a completely static Rust binary with no external dependencies? If so, try:

alias rust-musl-builder='docker run --rm -it -v "$(pwd)":/home/rust/src ekidd/rust-musl-builder'
rust-musl-builder cargo build --release

This command assumes that $(pwd) is readable and writable by uid 1000, gid 1000. It will output binaries in target/x86_64-unknown-linux-musl/release. At the moment, it doesn't attempt to cache libraries between builds, so this is best reserved for making final release builds.

Deploying your Rust application

With a bit of luck, you should be able to just copy your application binary from target/x86_64-unknown-linux-musl/release, and install it directly on any reasonably modern x86_64 Linux machine. In particular, you should be able to copy your Rust application into an Alpine Linux container.

How it works

rust-musl-builder uses musl-libc, musl-gcc, and the new rustup target support. It includes static versions of several libraries:

  • The standard musl-libc libraries.
  • OpenSSL, which is needed by many Rust applications.

Adding more C libraries

If you're using Docker crates which require specific C libraries to be installed, you can create a Dockerfile based on this one, and use musl-gcc to compile the libraries you need. For example:

FROM ekidd/rust-musl-builder

RUN VERS=1.2.8 && \
    cd /home/rust/libs && \
    curl -LO http://zlib.net/zlib-$VERS.tar.gz && \
    tar xzf zlib-$VERS.tar.gz && cd zlib-$VERS && \
    CC=musl-gcc ./configure --static --prefix=/usr/local/musl && \
    make && sudo make install && \
    cd .. && rm -rf zlib-$VERS.tar.gz zlib-$VERS

This usually involves a bit of experimentation for each new library, but it seems to work well for most simple, standalone libraries.

If you need an especially common library, please feel free to submit a pull request adding it to the main Dockerfile! We'd like to support popular Rust crates out of the box.

Development notes

After modifying the image, run ./test-image to make sure that everything works.

License

Either the Apache 2.0 license, or the MIT license.