В соответствии с руководством, которое я прочитал, использование " docker run -d
" запустит контейнер из изображения, и контейнер будет работать в фоновом режиме. Вот как это выглядит, мы можем видеть, что у нас уже есть идентификатор контейнера.
root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d
Но если я побежал " docker ps
", ничего не вернулось.
Итак, я попытался " docker ps -a
", я вижу контейнер уже вышел:
root@docker:/home/root# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
605e3928cddd centos:latest "/bin/bash" 31 minutes ago Exited (0) 31 minutes ago kickass_swartz
Что-то я не так сделал? Как я могу устранить эту проблему?
docker run -it -d <image> /bin/bash
это, запускает командную оболочку в интерактивном режиме и не закрывает контейнер, потому что процесс оболочки активен.Ответы:
CentOS dockerfile имеет команду по умолчанию
bash
.Это означает, что при запуске в background (
-d
) оболочка немедленно завершается.Обновление 2017
Более поздние версии DOCKER Авторизуйтесь , чтобы запустить контейнер как в отдельном режиме и в режиме переднего плана (
-t
,-i
или-it
)В этом случае вам не нужны никакие дополнительные команды, и этого достаточно:
Баш будет ждать в фоновом режиме.
Это было первоначально сообщалось в Кальяни-Chaudhari «s ответ и подробно описано в джерси боб » ы ответ .
Обратите внимание, что для альпийских , Marinos An сообщает в комментариях :
Оригинальный ответ (2015)
Как уже упоминалось в этой статье :
Так что это будет работать:
А
docker ps
покажет контейнер с центосом, все еще работающий.Оттуда вы можете присоединиться к нему или отсоединиться от него (или
docker exec
некоторых команд).источник
docker exec -it <yourContainer> bash
.Согласно этому ответу , добавление
-t
флага предотвратит выход контейнера при работе в фоновом режиме. Затем вы можете использовать,docker exec -i -t <image> /bin/bash
чтобы войти в приглашение оболочки.Кажется, что опция -t не очень хорошо документирована , хотя в справке говорится, что она «выделяет псевдо-TTY».
источник
tail -f /dev/null
docker run -t -d --name mysql -p 3306:3306 mysql
- не работает для меня (Ubuntu 14.04.5): STATUS = возбужденном (1) 4 секунды назадЗадний план
Контейнер Docker запускает процесс («команда» или «точка входа»), который поддерживает его работу. Контейнер будет продолжать работать, пока команда продолжает выполняться.
В вашем случае команда (
/bin/bash
по умолчаниюcentos:latest
включена) немедленно завершает работу (как это делает bash, когда он не подключен к терминалу и ему нечего запустить).Обычно, когда вы запускаете контейнер в режиме демона (с
-d
), контейнер выполняет какой-то процесс демона (напримерhttpd
). В этом случае, пока запущен демон httpd, контейнер останется живым.Похоже, что вы пытаетесь сделать это, чтобы контейнер оставался в живых без запуска процесса-демона внутри контейнера. Это несколько странно (потому что контейнер не делает ничего полезного, пока вы не взаимодействуете с ним, возможно, с
docker exec
), но в некоторых случаях может иметь смысл сделать что-то подобное.(Вы хотели попасть в командную строку bash внутри контейнера? Это просто!
docker run -it centos:latest
)Решение
Простой способ сохранить контейнер живым в режиме демона на неопределенный срок - запустить его
sleep infinity
как команду контейнера. Это не зависит от выполнения странных вещей, таких как выделение TTY в режиме демона. Хотя он полагается на странные вещи, такие как использование вsleep
качестве основной команды.Альтернативное решение
Как указано cjsimon,
-t
опция выделяет «псевдо-tty». Эти трюки заставляют продолжать работать бесконечно, потому что он думает, что он подключен к интерактивному TTY (даже если у вас нет возможности взаимодействовать с этим конкретным TTY, если вы не проходите мимо-i
). В любом случае, это тоже должно сработать:Не уверен на 100%, вызовут ли
-t
другие странные взаимодействия; возможно оставьте комментарий ниже, если это так.источник
infinity
.Привет, это проблема, потому что контейнеры Docker завершают работу, если в контейнере нет запущенного приложения.
Опция - просто запустить контейнер в режиме deamon.
Таким образом, хитрость для обеспечения непрерывной работы вашего контейнера заключается в указании файла оболочки в Docker, который будет поддерживать работу вашего приложения. Вы можете попробовать запустить файл start.sh
Этот start.sh должен указывать на бесконечное приложение.
В случае, если вы не хотите, чтобы какое-либо приложение работало, вы можете установить,
monit
что будет поддерживать ваш док-контейнер. Пожалуйста, дайте нам знать, сработали ли эти два случая, чтобы ваш контейнер работал.Всего наилучшего
источник
Вы можете выполнить то, что вы хотите с помощью:
или
или
Параметр команды, предложенный другими ответами (т. Е. Tail -f / dev / null), является необязательным и НЕ обязателен, чтобы ваш контейнер продолжал работать в фоновом режиме.
Также обратите внимание, что документация Docker предполагает, что сочетание параметров -i и -t приведет к тому, что он будет вести себя как оболочка.
Видеть:
https://docs.docker.com/engine/reference/run/#foreground
источник
У меня есть этот фрагмент кода из
ENTRYPOINT
моего файла Docker:Запустите образ встроенного докера как:
Войдите в оболочку контейнера:
источник
выполнить команду следующим образом:
если вы хотите указать порт, то введите команду, как показано ниже:
проверьте работающий контейнер, используя следующую команду:
источник
-t -d
против-i -d
? Оба будут поддерживать контейнер в рабочем состоянии.Docker требует, чтобы ваша команда продолжала работать на переднем плане. В противном случае он считает, что ваши приложения останавливаются и завершают работу контейнера.
Так что, если ваш скрипт входа в докер является фоновым процессом, как показано ниже:
'&' Заставляет контейнер останавливаться и выходить, если нет других процессов переднего плана, запущенных позже. Таким образом, решение состоит в том, чтобы просто удалить '&' или запустить другой CMD переднего плана , например
источник
touch
, сначала понадобится этот файл, если вы не можете найти файл журнала.Контейнер Docker завершается, если задание внутри выполнено, поэтому, если вы хотите сохранить его в рабочем состоянии, даже если у него нет какой-либо работы или он уже завершен, вы можете это сделать
docker run -di image
. После того, как вы это сделаете,docker container ls
вы увидите, что он работает.источник
Возможно, это только я, но в CentOS 7.3.1611 и Docker 1.12.6, но мне пришлось использовать комбинацию ответов, опубликованных @VonC & @Christopher Simon, чтобы это работало надежно. Ничто из того, что я сделал до этого, не остановило бы выход контейнера после успешного запуска CMD. Я запускаю oracle-xe-11Gr2 и sshd.
Dockerfile
Затем добавьте -d -t и -i для запуска
Наконец, после нескольких часов ударов головой о стену
По любой причине вышеприведенное завершится после выполнения CMD, если удален хвост -f или какие-либо из параметров -t -d -i опущены.
источник
Я объяснил это в следующем посте, который имеет тот же вопрос.
Как сохранить докер альпийский контейнер после использования «выхода»?
источник
У меня была та же проблема, просто открытие другого терминала с bash на нем работало для меня:
создать контейнер:
стартовый контейнер:
Запустите bash, чтобы контейнер продолжал работать:
Начать процесс вам нужно:
источник
Если вы используете CMD в конце вашего Dockerfile, вы можете добавить код в конце. Это будет работать только в том случае, если ваш докер построен на Ubuntu или на любой ОС, которая может использовать bash.
Вкратце конец вашего Dockerfile будет выглядеть примерно так.
Так что, если у вас что-то запускается автоматически после запуска образа докера, и когда задача будет выполнена, терминал bash будет активен внутри вашего докера. Таким образом, вы можете ввести свои команды оболочки.
источник
Запуск докера с интерактивным режимом может решить проблему.
Вот пример для бегущего изображения с и без интерактивного режима
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker run -d -t -i test_again1.0 b6b9a942a79b1243bada59db19c7999cfff52d0a8744542fa843c95354966a18
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker ps
КОНТЕЙНЕР ID ИМИДЖ КОМАНДА СОЗДАННЫЕ СТАТУС ИМЕНА ПОРТОВ
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker run -d -t -i test_again1.0 bash c3d6a9529fd70c5b2dc2d7e90fe662d19c6dad8549e9c812fb2b7ce2105d7ff5
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker ps
ID КОНТЕЙНЕРА ИМИДЖ СОЗДАННЫЕ ИМЕНА СОСТОЯНИЯ ПОРТОВ СОСТОЯНИЯ c3d6a9529fd7 test_again1.0 "bash" 2 секунды назад Up 1 секунда awesome_haibt
источник
если вы хотите работать с контейнером, вам нужно запустить его на переднем плане, чтобы сохранить его в живых.
источник
Порядок аргументов имеет значение
Ответ Jersey Beans (все 3 примера) работал на меня. После долгих проб и ошибок я понял, что порядок аргументов имеет значение.
Контейнер работает в фоновом режиме:
docker run -t -d <image-name>
Сохраняет контейнер работающим на переднем плане:
docker run <image-name> -t -d
Это не было очевидно для меня, исходя из фона Powershell.
источник