2015-08-17 2 views
3

Я пытаюсь закрепить приложение графического интерфейса и добился определенных успехов. Если я создам файл докеров в изображении, а затем выполните команду docker run --name testcontainer testimage, похоже, что процесс начинается, но внезапно останавливается. Затем я проверяю контейнер с помощью docker ps, чтобы подтвердить, что контейнеры не работают. Затем я проверяю docker ps -a и вижу, что он вышел со статусом exit(0). Затем, если я запустил команду docker start testcontainer, она снова запустит команду ENTRYPOINT, но на этот раз она сможет продолжить, и появится графический интерфейс.Выход контейнера докера (0) при использовании команды запуска докеров, но работает с командой запуска докера

Мое лучшее предположение заключается в том, что я думаю, что когда я запускаю команду docker run, процесс начинается, но может быть раздвоен в фоновый процесс, в результате чего контейнер выйдет с тех пор, как завершился процесс переднего плана. Хотя это может быть далеко, потому что вы думаете, что команда docker start приведет к такому же результату. Я думал о попытке заставить процесс остаться на переднем плане, но не знаю, как это сделать. Какие-либо предложения?

ОБНОВЛЕНИЕ: Я редактировал свой файл Docker для использования supervisord для управления запуском приложения GUI. Теперь моя команда запуска docker запустит супервизор, который запустит мое графическое приложение, и оно будет работать. Некоторые вещи, чтобы отметить об этом в том, что руководитель показывает:
INFO spawned: myguiapp with pid 7
INFO success: myguiapp entered RUNNING state
INFO: exited: myguiapp (exit status 0; expected)
супервизора и контейнер все еще работают в этой точке, которая, кажется, что основной процесс стартует дочерний процесс. Поскольку супервизор все еще работает, мой контейнер остается, и приложение GUI появляется, и я могу его использовать. Когда я закрываю GUI, отчеты супервизора:
CRIT reaped unknown pid 93
Супервизор остается включенным, в результате чего контейнер НЕ закрывается. Поэтому мне нужно CTRL-C убить супервизора. Я бы предпочел не использовать супервизора, но если мне это нужно, я бы хотел, чтобы супервизор был изящно закрыт, когда заканчивается этот дочерний процесс. Если бы я мог выяснить, как заставить мой контейнер или супервизор отслеживать дочерние процессы основного процесса, я думаю, что это будет разрешено.

+0

как делает ваш dockerfile и начать команду выглядеть? если ваша команда запуска завершена, ваши контейнеры тоже выходят. Поэтому начало вашего процесса на переднем плане звучит как хорошая идея. – christian

+0

Извините, я не понимаю, что вы имеете в виду. Моя команда запуска докера работает нормально после выхода команды запуска. моя команда ENTRYPOINT - это только путь CLI к исполняемому файлу для приложения GUI, которое я докетирую. –

ответ

2

Первый вопрос, вероятно, потому, что для вашего приложения требуется tty, и вы не выделяете pseudo tty. Попробуйте запустить свой контейнер, как это:

docker run -t --name testcontainer testimage 

Когда вы делаете docker start во второй раз вокруг него как-то выделяет псевдо-терминал и процесс продолжает работать. Я попробовал это сам. Однако я не мог найти эту информацию в документах Docker.

Кроме того, если ваш пользовательский интерфейс в интерактивном режиме вы хотите:

docker run -t -i --name testcontainer testimage 
+1

Я бы также добавил '-i 'для интерактивных, для графического интерфейса – user2915097

+0

графический интерфейс является интерактивным, но, похоже, не требует -i. При этом я пробовал - так же, как и каждый флаг, без изменений результатов. –

+0

@CommanderCody вы можете опубликовать свой файл Dockerfile? а также какой тип графического интерфейса? Какой язык? Какая библиотека? – Rico

Смежные вопросы