Inherit from BaseImage instead of BuildPack
MODIFY
repo2docker/buildpacks/nix/__init__.py
repo2docker/buildpacks/nix/__init__.py
"""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):

MODIFY
repo2docker/buildpacks/nix/install-nix.bash
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

MODIFY
repo2docker/buildpacks/nix/nix-shell-wrapper
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"

ADD
tests/nix/binder-dir/README.rst
+default.nix in a binder/ directory
+----------------------------------
+
+Check we find and use `default.nix` when it is in a `binder/` sub-directory.

MODIFY
tests/nix/simple/default.nix
tests/nix/simple/default.nix
@@ -11,8 +11,6 @@ in
pkgs.mkShell {
buildInputs = with pkgs; [
python36Packages.numpy
- python36Packages.scipy
- python36Packages.jupyterlab
];
shellHook = ''

MODIFY
tests/nix/simple/verify
tests/nix/simple/verify
#!/usr/bin/env python
+
import numpy
-import scipy

ADD
tests/nix/start/README.rst
+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.

ADD
tests/nix/start/default.nix
+let
+ # Pinning nixpkgs to specific release
+ # To get sha256 use "nix-prefetch-git <url> --rev <commit>"
+ 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}:."
+ '';
+}

ADD
tests/nix/start/start
+#!/bin/bash
+
+export TEST_START_VAR="var is set"
+
+exec "$@"

ADD
tests/nix/start/verify
+#!/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

Inherit from BaseImage instead of BuildPack