2016-04-21 8 views
1

Я не могу получить скрипт для возврата в bash.Не удается вернуться в сеанс оболочки после сценария

Сценарий стартовал с помощью следующих директив Docker:

ENTRYPOINT ["/bin/bash", "-c"] 
CMD ["set -e && /config/startup/init.sh"] 

скриптов начальных выглядят следующим образом:

#!/bin/bash 

if [ -d /etc/postfix/init.d ]; then 
    for f in /etc/postfix/init.d/*.sh; do 
     [ -f "$f" ] && . "$f" 
    done 
fi 

echo "[x] Starting supervisord ..." 
/usr/bin/supervisord -c /etc/supervisord.conf 

bash 

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

docker run -it --env-file ENV_LOCAL mailrelay 

Сценарий инициализации работает как ожидалось (и я вижу вывод из сценариев в пределах /etc/postfix/init.d/ и supervisord стартует Postfix.

Проблема заключается в том, что сценарий возвращается к родительскому процессу (bash), а не к необходимости запуска нового. После того, как он попадает в supervisord, сеанс сидит там, требуя Ctrl + C, чтобы вернуть его обратно в приглашение bash.

Если я оставил вызов bash в конце сценария init.sh, Ctrl + D завершает сценарий И контейнер, возвращая меня в ОС хоста (OSX). Если я заменил вызов bashexit, он также возвращается к ОС хоста.

supervisord Ведет себя так, как должно было быть, выполняя на переднем плане этот путь? Я хотел бы иметь возможность легко вернуться в сеанс оболочки контейнера, чтобы проверить, все ли работает. Я ушел с необходимостью Ctrl + D (во второй сеанс bash), чтобы сделать это?

UPDATE Marc B

вынуть Баш линию, так что вам не начать новую оболочку. и если supervisord не идет в фоновом режиме автоматически, вы можете попробовать запустить его с &, чтобы заставить его на задний план, или, может быть есть дополнительный вариант кли, чтобы заставить его перейти в режим демона

Я попытался удалить последний вызов bash, но, как я уже упоминал, он все еще сидит там, а Ctrl + D переносит меня в ОС хоста (выходит из контейнера).

Я только что попробовал /usr/bin/supervisord -c /etc/supervisord.conf & (и оставил звонок до bash в конце), и он сразу же возвращается в ОС хоста, выходя из контейнера. Я предполагаю, что контейнеру нечего было «делать», и поэтому он остановился.

+0

, если вы хотите, чтобы вернуться к приглашению parentl оболочки , почему вы запускаете NEW bash в конце скрипта? что пинает вас в этот ребенок bash, а не родительский. –

+0

Да, как мне вернуться к родительскому? – AVProgrammer

+0

вынимают строку 'bash', поэтому вы не запускаете новую оболочку. и если супервизор не входит в фоновый режим автоматически, вы можете попробовать запустить его с помощью '&', чтобы заставить его зайти в фоновый режим, или, может быть, есть дополнительный параметр cli, чтобы заставить его перейти в режим демона. –

ответ

2
#!/bin/bash 

if [ -d /etc/postfix/init.d ]; then 
    for f in /etc/postfix/init.d/*.sh; do 
     [ -f "$f" ] && . "$f" 
    done 
fi 

echo "[x] Starting supervisord ..." 
/usr/bin/supervisord -c /etc/supervisord.conf 
one 
bash # You are spawning a new bash shell here. Remove this statement 

В конце вы как раз застряли в ребенок Баша оболочке :(

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

/usr/bin/supervisord -c /etc/supervisord.conf 

Вы можете заставить команду работать в фоновом режиме

/usr/bin/supervisord -c /etc/supervisord.conf & #the & tells to run in background 

обходной путь для хранения контейнера с открытым упоминается here

+0

Это похоже на работу, кроме что контейнер выходит из-за того, что скрипт завершается, и поэтому bash (PID 1) завершается, а затем демон Docker останавливается ... – AVProgrammer

+1

@AVProgrammer: См. [этот вопрос] (http://stackoverflow.com/questions/28212380/ почему-docker-container-exits-немедленно) – sjsam

+1

Спасибо @sjsam Я решил запустить supervisord как PID 1 и использовать '/ etc/supervisord.conf' (полезную директиву include), чтобы запустить скрипты, которые init.sh (с конфигурацией, специфичной для процесса). Спасибо. – AVProgrammer