Образ Docker не может запустить процесс в режиме переднего плана - PullRequest
0 голосов
/ 24 октября 2019

Я разрабатываю образ докера на основе nvidia / cuda: 10.1-base-ubuntu18.04. Во время сборки установлен пользовательский веб-сервер, и у меня есть docker-entrypoint.sh, который запускает сервер в зависимости от того, установлен ли env var во время выполнения.

Это все работает нормально, если я запускаю контейнер в интерактивном режиме. режим:

docker run -it -p 5000:5000 -e RUN_SERVER=1 myImage/17.5.360/all /bin/bash

Или используйте старый "хак", чтобы сохранить изображение:

docker run -d -p 5000:5000  -e RUN_SERVER=1 myImage/17.5.360/all /bin/bash -c "tail -f /dev/null"

Но когда я следую за самым последним ответом из здесь :

docker run -t -d -p 5000:5000 -e RUN_SERVER=1 myImage/17.5.360/all

Изображение загружается успешно и сохраняется, но сервер не активен.

Вот сокращенная версия docker-entrypoint.sh:

#! /bin/bash
if [ $RUN_SERVER = "1" ]; then
   runMyServer
fi
exec "$@"

И Dockerfile:

FROM nvidia/cuda:10.1-base-ubuntu18.04 AS HInstaller  
ENV RUN_SERVER=0  # Defaults to not run the server

# ...

COPY "./docker-entrypoint.sh" /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]

Как мне отладить, что происходит, поскольку работает интерактивный режим?

1 Ответ

0 голосов
/ 24 октября 2019

Ваш сценарий точки входа заканчивается строкой

exec "$@"

, которая означает замену текущего процесса на все, что было передано в качестве аргументов командной строки. Когда есть и точка входа, и команда, команда передается в качестве аргументов точке входа.

В первых двух примерах вы даете какую-то команду в командной строке docker run, и контейнер сохранитработает, пока это работает. В последних двух примерах, если что-либо отсутствует в командной строке или в инструкции Dockerfile CMD, команда будет пустой. Эта строка exec ничего не будет делать, и сценарий точки входа будет успешно завершен.

Не очень хорошо иметь контейнер с интерактивной оболочкой или бессмысленную команду tail, а такжеПобочный эффект запускает какой-то сервис. Вы хотите запустить свой сервис как приоритетный процесс и сделать его основным контейнерным процессом. Служба запускается в фоновом режиме, поэтому обычно существует какая-то опция «переднего плана» для ее обхода. Если вы введете что-то вроде

CMD ["runMyServer", "--foreground"]

, это будет выполняться в этой строке exec "$@". Если ваш сценарий входа уменьшен до этой строки, вы можете удалить его.

...