#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