Я запускаю контейнер в фоновом режиме, используя
docker run -d --name hadoop h_Service
это быстро выходит. Но если я бегу на переднем плане, все работает нормально. Я проверил журналы, используя
docker logs hadoop
ошибки не было Любые идеи?
DOCKERFILE
FROM java_ubuntu_new
RUN wget http://archive.cloudera.com/cdh4/one-click-install/precise/amd64/cdh4-repository_1.0_all.deb
RUN dpkg -i cdh4-repository_1.0_all.deb
RUN curl -s http://archive.cloudera.com/cdh4/ubuntu/precise/amd64/cdh/archive.key | apt-key add -
RUN apt-get update
RUN apt-get install -y hadoop-0.20-conf-pseudo
RUN dpkg -L hadoop-0.20-conf-pseudo
USER hdfs
RUN hdfs namenode -format
USER root
RUN apt-get install -y sudo
ADD . /usr/local/
RUN chmod 777 /usr/local/start-all.sh
CMD ["/usr/local/start-all.sh"]
start-all.sh
#!/usr/bin/env bash
/etc/init.d/hadoop-hdfs-namenode start
/etc/init.d/hadoop-hdfs-datanode start
/etc/init.d/hadoop-hdfs-secondarynamenode start
/etc/init.d/hadoop-0.20-mapreduce-tasktracker start
sudo -u hdfs hadoop fs -chmod 777 /
/etc/init.d/hadoop-0.20-mapreduce-jobtracker start
/bin/bash
chmod 777
является небезопасным и неправильно. Вы должны вернуться к нормальным разрешениям (вероятно, 755 в этом случае).Ответы:
Контейнер Docker завершается, когда завершается его основной процесс.
В этом случае он завершится, когда
start-all.sh
закончится ваш скрипт. Я не знаю достаточно о hadoop, чтобы рассказать вам, как это сделать в этом случае, но вам нужно либо оставить что-то запущенное на переднем плане, либо использовать диспетчер процессов, такой как runit или supervisord, для запуска процессов.Я думаю, вы должны ошибаться, если вы не укажете
-d
; это должно иметь точно такой же эффект. Я подозреваю, что вы запустили его с немного другой командой или с помощью-it
которой что-то изменится.Простое решение может быть добавить что-то вроде:
while true; do sleep 1000; done
до конца сценария. Однако мне это не нравится, так как скрипт должен реально отслеживать запущенные процессы.
(Я должен сказать, что украл этот код с https://github.com/sequenceiq/hadoop-docker/blob/master/bootstrap.sh )
источник
Это помогло мне:
После этого я проверил процессы, запущенные с помощью:
Для прикрепления контейнера
СОВЕТ: Для выхода без остановки типа контейнера:
^P^Q
источник
-dit
просто стенография-di
- необходимый минимум, этот-t
параметр является избыточным при использовании с,-d
если я правильно понимаю-t
подключите его снова, но не включите его, но я обычноexec
каждый раз получаю новый bash, когда не замечаю. У меня были проблемы с отсоединением от Mac, но, возможно, я делаю это неправильно ..Я хотел бы расширить или осмелиться сказать, улучшить ответ упомянутый camposer
Когда ты бежишь
вы в основном запускаете контейнер в фоновом режиме в интерактивном режиме.
Когда вы присоединяете и выходите из контейнера с помощью сочетания клавиш CTRL + D (наиболее распространенный способ сделать это), вы останавливаете контейнер, потому что вы просто уничтожили основной процесс, который вы запустили в свой контейнер с помощью приведенной выше команды.
Используя преимущества уже запущенного контейнера, я бы просто запустил еще один процесс bash и получил псевдо TTY, запустив:
источник
всякий раз, когда я хочу, чтобы контейнер оставался после завершения выполнения скрипта, я добавляю
в конце команды. Так и должно быть:
источник
Если вы хотите заставить изображение зависать (для того, чтобы что-то отладить или проверить состояние файловой системы), вы можете переопределить точку входа, чтобы изменить его на оболочку:
источник
Хорошим подходом было бы запустить ваши процессы и службы, запустив их в фоновом режиме, и использовать
wait [n ...]
команду в конце вашего скрипта. В bash команда ожидания заставляет текущий процесс:Я получил эту идею из стартового сценария Себастьяна Пухадаса для его лося .
Исходя из исходного вопроса, ваш start-all.sh будет выглядеть примерно так ...
источник
Добавьте это в конец Dockerfile:
Пример файла Docker:
Ссылка
источник
CMD tail -f /dev/null
проходит через этоsh -c "..."
. Можем ли мы использоватьexec
вместо этого форму? То естьCMD ["tail", "-f", "/dev/null"]
Моя практика в Dockerfile запустить оболочку, которая не будет выходить сразу
CMD [ "sh", "-c", "service ssh start; bash"]
, а затем запуститьdocker run -dit image_name
. Таким образом, служба (ssh) и контейнер работают.источник
Я добавил
read
заявление оболочки в конце. Это поддерживает основной процесс контейнера - сценарий запуска оболочки.источник
Добавление
в конце моего сценария оболочки было мое исправление!
источник
Если вы проверяете Dockerfile из контейнеров, например fballiano / magento2-apache-php
вы увидите, что в конце своего файла он добавляет следующую команду: while true; спать 1; сделано
Теперь, что я рекомендую, это то, что вы делаете это
Затем вы увидите, что в вашем образе докера произошла ошибка, если он завершился с 0, то, вероятно, ему нужна одна из этих команд, которая будет спать вечно.
источник
Существует много возможных способов немедленного выхода из докера. Для меня это была проблема с моей
Dockerfile
. В этом файле была ошибка. Я имелENTRYPOINT ["dotnet", "M4Movie_Api.dll]
вместоENTRYPOINT ["dotnet", "M4Movie_Api.dll"]
. Как вы видите, я пропустил одну цитату (") в конце.Чтобы проанализировать проблему, я запустил свой контейнер и быстро прикрепил свой контейнер, чтобы понять, в чем именно заключалась проблема.
Где 4ea373efa21b - мой идентификатор контейнера. Это сводит меня к актуальной проблеме.
После обнаружения проблемы мне пришлось снова собирать, восстанавливать, публиковать свой контейнер.
источник
Исходя из дубликатов, я не вижу здесь никакого ответа, который бы касался очень распространенного антипаттерна, состоящего в том, чтобы выполнять основную рабочую нагрузку в качестве фонового задания, а затем удивляться, почему Docker завершает работу.
Проще говоря, если у вас есть
затем либо возьмите,
&
чтобы запустить задание на переднем плане, либо добавьтев конце скрипта, чтобы он дождался всех фоновых заданий.
Затем он все равно завершится, если основная рабочая нагрузка завершится, поэтому, возможно, запустите его в
while true
цикле, чтобы принудительно перезапустить его навсегда:(Обратите также внимание на то, как писать
while true
. Часто можно видеть глупые вещи, которые, как это происходит,while [ true ]
илиwhile [ 1 ]
которые случайно происходят, работают, но не имеют в виду то, что, по мнению автора, они должны иметь в виду.)источник
Вам нужно запустить его с флагом -d, чтобы он работал в фоновом режиме как демон.
источник
Вы можете запустить контейнер, используя этот флаг перезапуска.
источник
Поскольку образ является linux, нужно проверить, чтобы все сценарии оболочки, используемые в контейнере, имели окончание строки Unix. Если у них есть ^ M в конце, то они являются окончаниями строки Windows. Один из способов исправить это с помощью dos2unix в /usr/local/start-all.sh, чтобы конвертировать их из windows в unix. Запуск докера в интерактивном режиме может помочь решить другие проблемы. Вы могли бы иметь опечатку имени файла или что-то. см. https://en.wikipedia.org/wiki/Newline
источник