Проблемы с получением Singularity Compose для работы

#singularity-container #singularity-compose

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

Вопрос:

Я написал небольшой тестовый проект для Singularity Compose, состоящий из небольшого серверного приложения, со следующим файлом YAML:

 version: "1.0"
instances:
    server:
        build:
            context: ./server
            recipe: server.recipe
            ports:
                - 9999:9999
 

Когда я вызываю singularity-compose build , он успешно строится server.sif . Вызов singularity-compose up также, по-видимому, работает без ошибок, и вызов singularity-compose ps приводит к чему-то, что выглядит просто отлично:

   singularity-compose ps
INSTANCES  NAME PID     IMAGE
1        server 4176911 server.sif
 

Однако серверное приложение не работает, вызов моего тестового клиента приводит к тому, что он сообщает, что ответа от сервера нет.
Но если я запускаю server.sif напрямую без compose, все работает просто отлично.
Кроме того, я проверил, что мое тестовое приложение прослушивает порт 9999, поэтому должно быть доступно извне.

Что я сделал не так?


Редактировать:
я также проверил, действительно ли какой-либо процесс прослушивает порт 9999 путем вызова sudo lsof -i -P -n | grep LISTEN , это не так. Только когда я вручную запускаю server.sif без compose, он показывает мне процесс прослушивания.

Редактировать:
я вошел в оболочку Singularity Compose и попытался запустить Server приложение прямо там, просто в качестве теста, и это привело Permission denied к. Не уверен, что это что-то значит.

Редактировать:
теперь я предоставил права на выполнение приложения в оболочке и вызвал там, это работает. Сейчас я пытаюсь добавить права на выполнение в рецепт. Если это сработает, это было бы странно, поскольку исполняемый файл был собран прямо там и, следовательно, уже должен иметь права на выполнение.

Редактировать:
я добавил chmod x в свой рецепт как после сборки Server , так и перед его выполнением. Тоже не работает.

Также проверено, существуют ли какие-либо мосты с использованием brctl show , это не так.


Редактировать: мой рецепт, скорректированный с учетом ввода tsnowlan в его ответе ниже:

 Bootstrap: docker
From: ubuntu:20.04

%files
    connection.cpp
    connection.h
    main.cpp 
    server.cpp
    server.h 
    server.pro

%post

    # get some basics
    apt update
    apt-get install -y wget
    apt-get install -y software-properties-common

    # get C   compiler
    apt-get install -y g  
    apt-get install -y build-essential
    apt-get install -y build-essential cmake 

    # get Qt
    apt-get install -y qt5-default

    # compile
    qmake
    make

    ls

%runscript
    /Server

%startscript
    /Server
 

Опять же, обратите внимание, что приложение отлично работает как при компиляции и запуске в обычном режиме, так и при запуске в образе Singularity (но без Singularity Compose).

ls В конце %post блока используется для проверки того, что Server приложение было успешно построено.

Ответ №1:

Пожалуйста, поделитесь server.recipe , так как трудно определить, что должно быть / происходит без этого.

Без этого я предполагаю, что у вас есть a %runscript в вашем файле определения, но нет %startscript . Когда изображение выполняется напрямую или через singularity run image.sif , содержимое %runscript определяет, что происходит. Для эмуляции стиля docker-compose изображения singularity запускаются как постоянные экземпляры. В этом случае %startscript блок определяет, что выполняется. Если он пуст, он просто запустится и будет сидеть там, ничего не делая. Это объясняет, почему при запуске вручную это работает, но не при использовании compose.

Комментарии:

1. У меня нет %startscript блока, так что, вероятно, так оно и было. Не могу протестировать его сейчас, поскольку мы перешли на другой подход, и singularity в настоящее время не работает (в общем, по некоторым другим причинам). Я постараюсь запомнить ваш ввод и, возможно, протестирую его в будущем.

2. Добавил %startscript и протестировал его, все еще не работает. Добавлен рецепт к моему вопросу.

3. это сработало нормально, когда я запустил его замену python3 -m http.server 9999 . что происходит, когда вы проверяете singularity-compose logs ? выполняется ли он также вручную, если вы используете чистую среду singularity run -e ... ? Ваш локальный env обычно пересылается по умолчанию, но, вероятно, не с помощью compose