{ description = "Example for making a container image with a static binary"; inputs = { flake-utils.url = "github:numtide/flake-utils"; nixpkgs.url = "github:NixOS/nixpkgs"; }; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; overlays = [ (final: prev: { wttr-delft = prev.callPackage ./wttr-delft.nix {}; }) ]; }; # We copy only the static binary to avoid pulling in any unwanted dependencies wttr-delft-only-binary = pkgs.runCommand "wttr-delft-only-binary" { nativeBuildInputs = [ pkgs.binutils ]; } '' mkdir $out cp ${pkgs.pkgsCross.musl64.pkgsStatic.wttr-delft}/bin/wttr-delft $out # Shrink the executable even more chmod u+w $out/wttr-delft strip --strip-all $out/wttr-delft chmod u-w $out/wttr-delft ''; # Docker image containing only the wttr-delft static binary # Actually, this makes a script that dumps the image to stdout on the fly, # in this way we can load the data directly into Podman, without having a copy # of the image in the Nix store; for large images this is very convenient! wttr-delft-container = pkgs.dockerTools.streamLayeredImage { name = "wttr-delft"; tag = "nix"; config = { Cmd = [ "${wttr-delft-only-binary}/wttr-delft" ]; Env = [ "SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt" ]; }; }; in { packages.default = wttr-delft-container; devShells.default = import ./podman-devshell.nix { inherit pkgs; }; } ); }