Докер - Контейнер не запущен

Я совсем новичок в докере. Я попытался запустить закрытый контейнер, как показано ниже,

  1. Я перечислил все доступные контейнеры, используя docker ps -a. В нем перечислено следующее:

    докер список всех изображений

  2. Я ввел следующие команды, чтобы запустить контейнер, который находится в стадии выхода, и войти в терминал этого изображения.

    docker start 79b3fa70b51d
    docker exec -it 79b3fa70b51d /bin/sh
    
  3. Это вызывает следующую ошибку.

    FATA[0000] Error response from daemon: Container 79b3fa70b51d is not running

Но когда я запускаю контейнер с помощью docker start 79b3fa70b51d. Он выдает идентификатор контейнера в качестве вывода, что нормально, если у него все работает нормально. Я не уверен, что вызывает эту ошибку. Любые идеи о причинах и предложения по этому поводу были бы мне очень полезны. Заранее спасибо.


person Stranger    schedule 13.04.2015    source источник
comment
Привет! Не могли бы вы объяснить, как вы решили эту проблему. Боюсь, что ответ ниже не имеет большого смысла   -  person Jay    schedule 12.10.2016
comment
@ApexFred, контейнеры Docker не похожи на виртуальные машины; они предназначены для запуска приложения. Когда приложение завершает работу, останавливается и контейнер. В этом случае пользователь установил приложение для контейнера на команду echo. Поскольку команда echo выполняет эхо, а затем завершается, контейнер также завершает работу с командой. Если он снова запускает контейнер, он выполняет эхо и снова завершает работу. Для команды EXEC требуется работающий контейнер. Поскольку контейнер остановлен, его нельзя использовать для выполнения дополнительных команд.   -  person duct_tape_coder    schedule 29.01.2019


Ответы (14)


Контейнер 79b3fa70b51d, кажется, выполняет только echo.

Это означает, что он запускается, выводится эхом и сразу же завершается.

Следующая docker exec команда не обнаружит, что она запущена, чтобы присоединиться к этот контейнер и выполнить любую команду: уже слишком поздно. Контейнер уже вышел.

Команда docker exec запускает новую команду в работающем контейнере.

Команда, запущенная с использованием docker exec, будет выполняться только во время работы основного процесса контейнера (PID 1).

person VonC    schedule 13.04.2015
comment
Привет, VonC, спасибо за ваш комментарий. Как мне добиться, чтобы зайти в терминал изображения? - person Stranger; 13.04.2015
comment
@Udhayakumar Простого docker run -it --rm udhayakumar/busyboxwithtouch должно быть достаточно, чтобы открыть сеанс. Точкой входа по умолчанию должна быть / bin / sh, но это зависит от вашего Dockerfile: вы могли определить другую точку входа и / или другой CMD. - person VonC; 13.04.2015
comment
Привет! Не могли бы вы объяснить, как вы решили эту проблему. Боюсь, этот ответ не имеет большого смысла - person Jay; 12.10.2016
comment
@Jawad При запуске busyboxwithtouch без каких-либо параметров по умолчанию используется интерактивная оболочка (которая не завершается немедленно). Это означает, что вы можете позже (docker exec) присоединиться к нему. - person VonC; 12.10.2016

По умолчанию docker-контейнер немедленно завершает работу, если у вас не запущена какая-либо задача в контейнере.

Чтобы контейнер продолжал работать в фоновом режиме, попробуйте запустить его с аргументом --detach (или -d).

Например:

docker pull debian

docker run -t -d --name my_debian debian
e7672d54b0c2

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e7672d54b0c2        debian              "bash"              3 minutes ago       Up 3 minutes                            my_debian

#now you can execute command on the container
docker exec -it my_debian bash
root@e7672d54b0c2:/# 
person Dio Phung    schedule 23.07.2017
comment
Это должен быть ответ, отлично. - person M Y; 20.11.2020

Если невозможно запустить основной процесс снова (на достаточно долгое время), есть также возможность commit преобразовать контейнер в новый образ и запустить новый контейнер из этого образа. Хотя это не обычный рабочий процесс передовой практики (новое изображение не воспроизводится), я считаю очень полезным время от времени отлаживать сбойный сценарий.

docker exec -it 6198ef53d943 bash
Error response from daemon: Container 6198ef53d9431a3f38e8b38d7869940f7fb803afac4a2d599812b8e42419c574 is not running

docker commit 6198ef53d943
sha256:ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33

docker run -it ace7ca65e6e bash
root@72d38a8c787d:/#
person Matthias Kuhn    schedule 10.03.2018
comment
Я выполнил тот же шаг, но недавно созданный контейнер недоступен из браузера, который был доступен раньше - person Muhammad Muazzam; 09.05.2019
comment
Обратите внимание, что команда запускает bash процесс в контейнере. Вероятно, у вас раньше был запущен веб-сервер, поэтому вам нужно будет проверить, какую команду нужно использовать для восстановления сервера. - person Matthias Kuhn; 09.05.2019

Прежде всего, нам нужно запустить контейнер докера

ankit@ankit-HP-Notebook:~$  sudo docker start 3a19b39ea021

                        3a19b39ea021

После этого проверяем контейнер докера:

ankit@ankit-HP-Notebook:~$  sudo docker ps -a

 CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS                   PORTS               NAMES

  3a19b39ea021        coreapps/ubuntu16.04:latest   "bash"              13 hours ago        
  Up 9 seconds                                 ubuntu1

  455b66057060        hello-world                   "/hello"            4 weeks ago         

Exited (0) 4 weeks ago                       vigorous_bardeen

Затем выполните следующую команду:

ankit@ankit-HP-Notebook:~$  sudo docker exec -it 3a19b39ea021 bash

root@3a19b39ea021:/# 
person Ankit gupta    schedule 31.08.2018
comment
Было бы полезно добавить текст, помогающий объяснить ваш ответ. - person Lauren Rutledge; 31.08.2018

Это происходит с изображениями, для которых сценарий не запускает службу, ожидающую запросов, поэтому контейнер закрывается в конце сценария.

Обычно это происходит с большинством базовых образов ОС (centos, debian и т. Д.), А также с образами node.

Лучше всего запустить изображение в интерактивном режиме. Пример ниже с изображением узла:

docker run -it node /bin/bash

Выход

root@cacc7897a20c:/# echo $SHELL
/bin/bash
person Michael P. Bazos    schedule 29.11.2019

Вот что у меня сработало.

Получите идентификатор контейнера и перезапустите.

docker ps -a --no-trunc 

ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33
person z atef    schedule 23.06.2020

docker run -it --entrypoint /bin/bash <imageid>

Это было опубликовано L0j1k в сообщении ниже и сработало для меня.

Как мне попасть в оболочку контейнера Docker?

person Wysong    schedule 20.08.2020

Причина в том, что было сказано в принятом ответе. Я добавляю дополнительную информацию, которая может дать более полное представление об этой проблеме.

  1. Статус контейнера включает Created, Running, Stopped, Exited, Dead и другие, насколько я знаю.
  2. Когда мы выполняем docker create, демон docker создаст контейнер со статусом Created.
  3. Когда docker start, демон docker запустит существующий контейнер, статус которого может быть Created или Stopped.
  4. Когда мы выполняем docker run, демон docker завершит его в два этапа: docker create и docker start.
  5. Когда docker stop, очевидно, демон докера остановит контейнер. Таким образом, контейнер будет в состоянии Stopped.
  6. Что касается самого главного, то контейнер на самом деле представляет себя удерживающим в себе длительный процесс. Когда процесс завершится, завершится и процесс удержания контейнера. Таким образом, статус этого контейнера будет Exited.

Когда завершается процесс? Другими словами, в чем заключается процесс, как мы его начали?
Ответ - CMD в файле докеров или command в следующем выражении, которое в некоторых изображениях по умолчанию равно bash, то есть ubutu: 18.04.

docker run ubuntu:18.04 [command]
person Light.G    schedule 05.09.2018

docker run -it <image_id> /bin/bash

Запустить в интерактивном режиме, запустив затем оболочку bash

person Syeda Arshiya    schedule 24.02.2020
comment
Думаю, флаг -d - это опечатка? - person ; 11.08.2020

Для тех, кто пытается сделать что-то подобное с помощью Dockerfile ...

Работа в автономном режиме не поможет. Контейнер всегда будет выходить (прекращать работу), если команда не блокирует, как в случае с bash.

В этом случае обходным путем может быть следующее: 1. Зафиксируйте полученный образ: (имя_контейнера = имя контейнера, из которого вы хотите создать образ, имя_образа = имя создаваемого образа docker commit имя_контейнера имя_образа 2. Используйте docker run для создания нового контейнера с использованием нового образа, указав команду, которую вы хотите запустить. Здесь я выполню «bash»: docker run -it image_name bash

Это даст вам интерактивный вход в систему, который вы ищете.

person ldobson    schedule 14.06.2020

Вот решение, когда контейнер докеров закрывается нормально, и вы можете редактировать файл Dockerfile.

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

Инструкции CMD и ENTRYPOINT определяют, какая команда выполняется при запуске контейнера. ... Dockerfile должен указывать хотя бы одну из команд CMD или ENTRYPOINT.

Когда вы создаете образ и не указываете какую-либо команду с помощью CMD или ENTRYPOINT, будет выполнена команда CMD или ENTRYPOINT базового образа.

Например, в официальном файле Dockerfile Ubuntu есть CMD ["/bin/bash"] (https://hub.docker.com/_/ubuntu < / а>). Теперь команда bin/bash/ может принимать ввод, а команда docker run -it IMAGE_ID присоединяет STDIN к контейнеру. В результате вы получаете интерактивный терминал, а контейнер продолжает работать.

Когда в Dockerfile указана команда с CMD или ENTRYPOINT, эта команда выполняется при запуске контейнера. Теперь, если эта команда может завершиться без ввода каких-либо данных, она завершится и контейнер выйдет. docker run -it IMAGE_ID НЕ будет предоставлять интерактивный терминал в этом случае. Примером может служить образ докера, созданный из файла Docker, приведенного ниже:

FROM ubuntu
ENTRYPOINT echo hello 

Если вам нужно перейти в терминал этого образа, вам нужно будет оставить контейнер работающим, изменив команду точки входа.

FROM ubuntu
ENTRYPOINT echo hello && sleep infinity 

После обычного запуска контейнера с docker run IMAGE_ID вы можете просто перейти к другому терминалу и использовать docker exec -it CONTAINER_ID bash, чтобы получить терминал контейнера.

person Sadman Sakib    schedule 30.10.2020
comment
и вы можете отредактировать Dockerfile: ключевой момент здесь. Проголосовали. - person VonC; 30.10.2020

В моем случае я изменил определенные имена файлов и имена каталогов родительского каталога Dockerfile. Из-за чего контейнер не находит требуемых параметров для его повторного запуска.

После переименования его обратно в исходные имена контейнер начал как масло.

person ross    schedule 07.12.2019

У меня другой взгляд на это. Я мог сделать docker ps и увидеть, что запущен контейнер докеров, я даже попытался перезапустить его, но как только я попытался получить сеанс для него с помощью New-PSSession -ContainerId $containerId -RunAsAdministrator, произошла ошибка, сказав:

## [ошибка] New-PSSession: входной ContainerId xxx не существует, ## [ошибка] или соответствующий контейнер не запущен.

Моя проблема заключалась в том, что я работал с сетевой службой, и у нее не было достаточно разрешений для просмотра контейнера, хотя я дал ему разрешения на запуск команд докеров (с конфигурацией группы безопасности докеров)

Я не знал, как включить работу с контейнерами, поэтому мне пришлось вернуться к его запуску от имени администратора.

person AbsolutelyFreeWeb    schedule 29.08.2020

использовать команду

> docker container ls

> docker image ls

Проверьте свой идентификатор изображения и запишите его. Здесь мой идентификатор изображения - 6c929ca002da, вы, ребята, должны использовать свой собственный идентификатор изображения вместо моего ..

> docker start 6c929ca002da 

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

> `docker exec -it 6c929ca002da bash`

после выполнения этой команды вы можете увидеть свой файл изображения в рабочем режиме, как это

корень @ 6c929ca002da

Здесь я использую корневой режим, перейдите в корневой режим с помощью команды

sudo su

person Finashu Khallar    schedule 26.04.2021