I want to start a new project, and I want to try to handle all the reproducibility / “containerization” in nix instead of dockerfiles. I see some examples online but I think they’re including more uncommon procedures and/or don’t do things the “nix” way.

What’s the right way to manage a simple python project? Should I just make a derivation.nix for use in nix-shell -p and have the ephemeral shell be my container? Can/should I do it with nix flakes instead? What would a simple nix flake look like that:

pulls an initial python repo from github

possibly executes whatever build instructions might be included

extends other system packages or other versions of the same python package,

has local area network access,

and GPU access

  • @ComradeKhoumragOP
    link
    English
    14 months ago

    Thanks, I think I finally got it, but I think I’ll need to switch to flakes if I want to be able to install say numpy==1.10.0 instead of latest (is there a way to specify which python package version should be installed in mkShell?)

    Does this explanation make sense?

    { pkgs ? import <nixpkgs> {} }:
    pkgs.mkShell {
      packages = with pkgs; [
        (python310Full.withPackages 
                            (python-pkgs: with python-pkgs;
                              [numpy pandas requests]))];
      #inputsFrom = [ pkgs.python310Full ];
    }
    

    To derive this ephemeral shell…

    use a package manager defaulted from nix packages: {pkgs ? import <nixpkgs> {} }:

    Make an ephemeral shell with programs located in the package manager: pkgs.mkShell {

    Define the set of installed packages in the ephemeral shell

     packages = with pkgs; [
        (python310Full.withPackages # Include python310 in the set of installed packages
                            (python-pkgs: with python-pkgs; # not entirely sure what's going on here, is python-pkgs a predefined arg? fails with nativeBuildInputs if this isn't here 
                              [numpy pandas requests]))]; # the pip packages to include