Как запустить программу Python с использованием Singularity из контейнера докеров?

Я создал контейнер докеров для своей программы на чистом Python и установил python main.py, который будет выполняться при запуске контейнера. Запуск контейнера на моем локальном компьютере работает должным образом. Однако я хочу запустить контейнер в высокопроизводительном кластере моего учреждения. Кластерные машины используют Singularity, который я использую для получения моего образа докера, размещенного на Dockerhub (репо darshank11 / ga_paci_final). Однако, когда я пытаюсь запустить контейнер Singularity, я получаю следующую ошибку: python3: can't open file 'main.py': [Errno 2] No such file or directory.

Я попытался изменить базовый образ в Dockerfile, например с FROM python:latest на FROM ubuntu:latest.. Я убедился, что контейнер докера работает на моем локальном компьютере, а затем попросил одного из моих коллег вытащить контейнер из Dockerhub и запустить это тоже. Все работает нормально, пока не доберусь до Singularity.

Вот мой файл докеров:

FROM ubuntu:16.04

RUN apt-get update -y && \
    apt-get install -y python3-pip python3-dev

RUN mkdir src
WORKDIR /src
COPY . /src

RUN pip3 install --upgrade pip
RUN pip3 install -r requirements.txt

CMD ["python3", "-u", "main.py"]

person Darshan Kalola    schedule 15.07.2019    source источник
comment
где вы сохранили файл main.py? если в / src, можете попробовать CMD ["python3", "-u", "/src/main.py"]?   -  person Vignesh SP    schedule 16.07.2019
comment
Файл main.py сохраняется в рабочем каталоге на локальном уровне, а затем копируется в каталог src. Кроме того, поскольку я установил WORKDIR /src, я смогу запустить python3 main.py. В обычном docker-контейнере все работает, только преобразование с использованием сингулярности вызывает проблемы.   -  person Darshan Kalola    schedule 16.07.2019
comment
Образ сингулярности создается с использованием образа Dockerfile / Docker, но некоторые вещи не переносятся. Контекст рабочего каталога - одна из таких вещей.   -  person tsnowlan    schedule 16.07.2019


Ответы (1)


Вы получаете эту ошибку, потому что контекст выполнения не соответствует вашим ожиданиям. Путь выполнения в сингулярности - это текущий каталог в ОС хоста (например, ~/ga_paci_final), который был смонтирован в образ сингулярности.

Как упоминалось в комментариях, одним из решений является предоставление полного пути к файлу python в операторе docker CMD. Другой вариант - изменить блок %runscript файла определения сингулярности примерно так:

%runscript
    cd /src
    python3 -u main.py

Таким образом вы убедитесь, что среда выполнения для Docker и Singularity идентична.

person tsnowlan    schedule 16.07.2019
comment
Должен ли я включать как Dockerfile, так и рецепт Singularity в каталог моего проекта? - person Darshan Kalola; 16.07.2019
comment
Это зависит! Если вы не хотите манипулировать несколькими файлами определения контейнера и при этом работать как с Docker, так и с Singularity, вы можете выполнить сборку непосредственно из образа докера: sudo singularity build ga_paci.simg docker://darshank11/ga_paci_final:first_try. В этом случае вместо указания полного пути, как указано выше, вызовите сценарий bash, который обеспечивает правильную настройку среды. Упрощенный пример здесь: gist.github.com/tsnowlan/bd31dd497b24d1a48ce64d15befdfc. - person tsnowlan; 17.07.2019