core/pkgs/build-support/singularity-tools/default.nix

90 lines
2.8 KiB
Nix
Raw Normal View History

2024-05-13 21:24:10 +00:00
{ runCommand, lib, stdenv, storeDir ? builtins.storeDir, writeScript
, singularity, writeClosure, bash, vmTools, gawk, util-linux, runtimeShell
, e2fsprogs }: rec {
2024-05-02 00:46:19 +00:00
shellScript = name: text:
writeScript name ''
#!${runtimeShell}
set -e
${text}
'';
2024-05-13 21:24:10 +00:00
mkLayer = { name, contents ? [ ]
2024-05-02 00:46:19 +00:00
# May be "apptainer" instead of "singularity"
2024-05-13 21:24:10 +00:00
, projectName ? (singularity.projectName or "singularity") }:
runCommand "${projectName}-layer-${name}" { inherit contents; } ''
2024-05-02 00:46:19 +00:00
mkdir $out
for f in $contents ; do
cp -ra $f $out/
done
'';
2024-05-13 21:24:10 +00:00
buildImage = let defaultSingularity = singularity;
in { name, contents ? [ ], diskSize ? 1024, runScript ? ''
#!${stdenv.shell}
exec /bin/sh'', runAsRoot ? null, memSize ? 512
, singularity ? defaultSingularity }:
let
projectName = singularity.projectName or "singularity";
runAsRootFile = shellScript "run-as-root.sh" runAsRoot;
runScriptFile = shellScript "run-script.sh" runScript;
result = vmTools.runInLinuxVM
(runCommand "${projectName}-image-${name}.img" {
buildInputs = [ singularity e2fsprogs util-linux gawk ];
layerClosure = writeClosure contents;
preVM = vmTools.createEmptyImage {
size = diskSize;
fullName = "${projectName}-run-disk";
};
inherit memSize;
} ''
rm -rf $out
mkdir disk
mkfs -t ext3 -b 4096 /dev/${vmTools.hd}
mount /dev/${vmTools.hd} disk
mkdir -p disk/img
cd disk/img
mkdir proc sys dev
2024-05-02 00:46:19 +00:00
2024-05-13 21:24:10 +00:00
# Run root script
${lib.optionalString (runAsRoot != null) ''
mkdir -p ./${storeDir}
mount --rbind ${storeDir} ./${storeDir}
unshare -imnpuf --mount-proc chroot ./ ${runAsRootFile}
umount -R ./${storeDir}
''}
2024-05-02 00:46:19 +00:00
2024-05-13 21:24:10 +00:00
# Build /bin and copy across closure
mkdir -p bin ./${builtins.storeDir}
for f in $(cat $layerClosure) ; do
cp -ar $f ./$f
done
2024-05-02 00:46:19 +00:00
2024-05-13 21:24:10 +00:00
for c in ${toString contents} ; do
for f in $c/bin/* ; do
if [ ! -e bin/$(basename $f) ] ; then
ln -s $f bin/
2024-05-02 00:46:19 +00:00
fi
2024-05-13 21:24:10 +00:00
done
done
# Create runScript and link shell
if [ ! -e bin/sh ]; then
ln -s ${runtimeShell} bin/sh
fi
mkdir -p .${projectName}.d
ln -s ${runScriptFile} .${projectName}.d/runscript
2024-05-02 00:46:19 +00:00
2024-05-13 21:24:10 +00:00
# Fill out .${projectName}.d
mkdir -p .${projectName}.d/env
touch .${projectName}.d/env/94-appsbase.sh
2024-05-02 00:46:19 +00:00
2024-05-13 21:24:10 +00:00
cd ..
mkdir -p /var/lib/${projectName}/mnt/session
echo "root:x:0:0:System administrator:/root:/bin/sh" > /etc/passwd
echo > /etc/resolv.conf
TMPDIR=$(pwd -P) ${projectName} build $out ./img
'');
2024-05-02 00:46:19 +00:00
2024-05-13 21:24:10 +00:00
in result;
2024-05-02 00:46:19 +00:00
}