luator
luator

Reputation: 5017

Singularity definition file with paths relative to it

Question

When building Singularity images using definition files, is there a way to specify the path to a file on the host system relative to the definition file (i.e. independent of where the build command is called)?

Example to Illustrate the Problem

I have the following files in the same directory (e.g. a git repository):

foobar.def looks as follows:

Bootstrap: library
From: ubuntu:20.04
Stage: build

%files
    # Add some_file.txt at the root of the image
    some_file.txt /some_file.txt

This works fine when I build with the following command in the directory which contains the files:

singularity build --fakeroot foobar.sif foobar.def

However, it fails if I call the build command from anywhere else (e.g. from a dedicated "build" directory) because it searches some_file.txt relative to the current working directory of the build command, not relative to the definition file.

Is there a way to implement the definition file such that the build works independently of where the command is called? I know that I could use absolute paths but this is not a viable solution in my case.

To make it even more complicated: My actual definition file is bootstrapping from another local image, which is located in the build directory. So ideally I would need a solution where some files are found relative the working directory while others are found relative to the location of the definition file.

Upvotes: 2

Views: 1305

Answers (1)

tsnowlan
tsnowlan

Reputation: 3772

Short answer: Not really

Longer answer: Not really, but there's a reason why and it shouldn't really matter for most use cases. While Docker went the route of letting you specify what your directory context is, Singularity decided to base all of its commands off the current directory where it is being executed. This also follows with $PWD being auto-mounted into the container, so it makes sense for it to be consistent.

That said, is there a reason you can't run singularity build --fakeroot $build_dir/foobar.sif foobar.def from the repo directory? There isn't any other output written besides the final image and it makes more sense for the directory with the data being used to be the context to work from.

Upvotes: 2

Related Questions