diff --git a/repo2docker/buildpacks/nix/__init__.py b/repo2docker/buildpacks/nix/__init__.py index a4841ebf..4b73cf63 100644 --- a/repo2docker/buildpacks/nix/__init__.py +++ b/repo2docker/buildpacks/nix/__init__.py @@ -1,10 +1,10 @@ """BuildPack for nixpkgs environments""" import os -from ..base import BuildPack +from ..base import BuildPack, BaseImage -class NixBuildPack(BuildPack): +class NixBuildPack(BaseImage): """A nix Package Manager BuildPack""" def get_path(self): @@ -57,12 +57,14 @@ class NixBuildPack(BuildPack): ('${NB_USER}', """ nix-channel --add https://nixos.org/channels/nixpkgs-unstable nixpkgs && \ nix-channel --update && \ - nix-shell default.nix --command "command -v jupyter" + nix-shell default.nix """) ] def get_start_script(self): """The path to a script to be executed as ENTRYPOINT""" + # the shell wrapper script duplicates the behaviour of other buildpacks + # when it coems to the `start` script return "/usr/local/bin/nix-shell-wrapper" def detect(self): diff --git a/repo2docker/buildpacks/nix/install-nix.bash b/repo2docker/buildpacks/nix/install-nix.bash index c4bf70e1..2a9c67f8 100644 --- a/repo2docker/buildpacks/nix/install-nix.bash +++ b/repo2docker/buildpacks/nix/install-nix.bash @@ -5,7 +5,7 @@ set -ex NIX_VERSION="2.1.1" NIX_SHA256="ad10b4da69035a585fe89d7330037c4a5d867a372bb0e52a1542ab95aec67999" -wget https://nixos.org/releases/nix/nix-$NIX_VERSION/nix-$NIX_VERSION-x86_64-linux.tar.bz2 +wget --quiet https://nixos.org/releases/nix/nix-$NIX_VERSION/nix-$NIX_VERSION-x86_64-linux.tar.bz2 echo "$NIX_SHA256 nix-2.1.1-x86_64-linux.tar.bz2" | sha256sum -c tar xjf nix-*-x86_64-linux.tar.bz2 sh nix-*-x86_64-linux/install diff --git a/repo2docker/buildpacks/nix/nix-shell-wrapper b/repo2docker/buildpacks/nix/nix-shell-wrapper index be7a3bfb..1a69e13c 100644 --- a/repo2docker/buildpacks/nix/nix-shell-wrapper +++ b/repo2docker/buildpacks/nix/nix-shell-wrapper @@ -8,8 +8,20 @@ _term() { trap _term SIGTERM -echo "$*" -nix-shell default.nix --command "$*" & +echo 'command:' "$@" + +# a script in the binder sub-directory take precedence +if [ -f ./binder/start ]; then + chmod u+x ./binder/start + nix-shell default.nix --command "./binder/start $@" & +elif [ -f ./start ]; then + chmod u+x ./start + nix-shell default.nix --command "./start $@" & +else + nix-shell default.nix --command "$@" & +fi PID=$! +echo 'waiting' + wait "$PID" diff --git a/tests/nix/binder-dir/README.rst b/tests/nix/binder-dir/README.rst new file mode 100644 index 00000000..6d79746c --- /dev/null +++ b/tests/nix/binder-dir/README.rst @@ -0,0 +1,4 @@ +default.nix in a binder/ directory +---------------------------------- + +Check we find and use `default.nix` when it is in a `binder/` sub-directory. diff --git a/tests/nix/simple/default.nix b/tests/nix/simple/default.nix index 7b2f7f59..d417565f 100644 --- a/tests/nix/simple/default.nix +++ b/tests/nix/simple/default.nix @@ -11,8 +11,6 @@ in pkgs.mkShell { buildInputs = with pkgs; [ python36Packages.numpy - python36Packages.scipy - python36Packages.jupyterlab ]; shellHook = '' diff --git a/tests/nix/simple/verify b/tests/nix/simple/verify index 4f794e84..dbd34b2a 100755 --- a/tests/nix/simple/verify +++ b/tests/nix/simple/verify @@ -1,3 +1,3 @@ #!/usr/bin/env python + import numpy -import scipy diff --git a/tests/nix/start/README.rst b/tests/nix/start/README.rst new file mode 100644 index 00000000..e82d782c --- /dev/null +++ b/tests/nix/start/README.rst @@ -0,0 +1,5 @@ +Check `start` works with nix +---------------------------- + +In this example we set a environment variable in the `start` script and check +it works when using the nix build pack. diff --git a/tests/nix/start/default.nix b/tests/nix/start/default.nix new file mode 100644 index 00000000..d417565f --- /dev/null +++ b/tests/nix/start/default.nix @@ -0,0 +1,19 @@ +let + # Pinning nixpkgs to specific release + # To get sha256 use "nix-prefetch-git --rev " + commitRev="5574b6a152b1b3ae5f93ba37c4ffd1981f62bf5a"; + nixpkgs = builtins.fetchTarball { + url = "https://github.com/NixOS/nixpkgs/archive/${commitRev}.tar.gz"; + sha256 = "1pqdddp4aiz726c7qs1dwyfzixi14shp0mbzi1jhapl9hrajfsjg"; + }; + pkgs = import nixpkgs { config = { allowUnfree = true; }; }; +in +pkgs.mkShell { + buildInputs = with pkgs; [ + python36Packages.numpy + ]; + + shellHook = '' + export NIX_PATH="nixpkgs=${nixpkgs}:." + ''; +} diff --git a/tests/nix/start/start b/tests/nix/start/start new file mode 100755 index 00000000..c458c91a --- /dev/null +++ b/tests/nix/start/start @@ -0,0 +1,5 @@ +#!/bin/bash + +export TEST_START_VAR="var is set" + +exec "$@" diff --git a/tests/nix/start/verify b/tests/nix/start/verify new file mode 100755 index 00000000..b466ab08 --- /dev/null +++ b/tests/nix/start/verify @@ -0,0 +1,9 @@ +#!/bin/bash +set -euo pipefail + +# set value of TEST_START_VAR to empty string when it is not defined +if [ "${TEST_START_VAR:-}" != "var is set" ] +then + echo "TEST_START_VAR is not set" + exit 1 +fi