разница между рабочим каталогом docker и singularity

#docker #singularity-container

#docker #сингулярность-контейнер

Вопрос:

У меня очень простой вопрос о docker и singularity. Я хотел бы иметь возможность запускать контейнер docker, используя как docker, так и singularity, но меня смущает разница между рабочим каталогом. Вот пример: ВНУТРИ моего контейнера docker у меня есть main.sh и test.sh .

Содержимое main.sh :

 #!/bin/bash

echo "Executing main.sh"
./test.sh
 

Содержимое test.sh :

 #!/bin/bash

echo "Executing test.sh"
 

При выполнении следующего:
sudo docker run -t myuser/mydocker:1.0 ./main.sh

Я получаю ожидаемый результат:

 Executing main.sh
Executing test.sh
 

Но при выполнении singularity exec -e docker://myuser/mydocker:1.0 /main.sh

Я получаю эту ошибку:

 Executing main.sh
/main.sh: line 4: ./test.sh: No such file or directory
 

Почему test.sh недоступен? Есть ли способ позволить ему работать через singularity без изменения содержимого main.sh ? Моя версия singularity — 3.6.3.

Спасибо!

Ответ №1:

Это одно из больших различий между docker и singularity.

В docker рабочий каталог задается в аргументе Dockerfile with WORKDIR /some/path или -w /some/path командной строке. В противном случае используется значение по умолчанию / .

Однако с singularity ваш домашний каталог (или текущий каталог в более старых версиях) на хост-компьютере монтируется и используется в качестве рабочего каталога внутри контейнера. Вы можете использовать --pwd флаг, чтобы переопределить это.

Итак, учитывая Dockerfile:

 FROM debian:buster-slim
COPY main.sh test.sh /
 

Запуск с помощью docker:

 $ docker run --rm myuser/mydocker:1.0 ./main.sh
Executing main.sh
Executing test.sh

$ docker run --rm myuser/mydocker:1.0 pwd
/
 

В singularity:

 # note the full path of the file that isn't found
$ singularity exec -e mydocker.sif ./main.sh
FATAL:   stat /home/tsnowlan/main.sh: no such file or directory

# does NOT match the WORKDIR from the Dockerfile
$ singularity exec -e mydocker.sif pwd
/home/tsnowlan

# use full path to the script
# BUT still executing from $HOME so `./test.sh` is resolves to `$HOME/test.sh`
$ singularity exec -e mydocker.sif /main.sh
Executing main.sh
/main.sh: line 4: ./test.sh: No such file or directory

# tell singularity to run from /
$ singularity exec -e --pwd / mydocker.sif ./main.sh
Executing main.sh in
Executing test.sh