#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