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


88

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

  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. Он выдает идентификатор контейнера в качестве вывода, что является нормальным, если у него все работает нормально. Я не уверен, что вызывает эту ошибку. Любые идеи о причинах и предложения по этому поводу были бы мне очень полезны. Заранее спасибо.


7
Привет! Не могли бы вы объяснить, как вы решили эту проблему. Боюсь, что ответ ниже не имеет большого смысла
JayPex

4
@ApexFred, контейнеры Docker не похожи на виртуальные машины; они предназначены для запуска приложения. Когда приложение завершает работу, останавливается и контейнер. В этом случае пользователь установил «приложение» для контейнера на команду «echo». Поскольку команда «echo» выполняет эхо и затем завершается, контейнер также завершается командой. Если он снова запускает контейнер, он выполняет эхо и снова завершает работу. Для команды EXEC требуется работающий контейнер. Поскольку контейнер остановлен, его нельзя использовать для выполнения дополнительных команд.
duct_tape_coder

Ответы:


30

79b3fa70b51dКажется, что контейнер выполняет только функцию echo.

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

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

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

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


1
Привет, VonC, спасибо за ваш комментарий. Как мне добиться перехода в терминал изображения?
Stranger

3
@Udhayakumar Простого docker run -it --rm udhayakumar/busyboxwithtouchдолжно быть достаточно, чтобы открыть сеанс. Точкой входа по умолчанию должна быть / bin / sh, но это зависит от вашего Dockerfile: вы могли определить другую точку входа и / или другой CMD.
VonC

50
Привет! Не могли бы вы объяснить, как вы решили эту проблему. Боюсь, этот ответ не имеет большого смысла
JayPex

2
@Jawad При запуске busyboxwithtouch без каких-либо параметров по умолчанию используется интерактивная оболочка (которая не завершается немедленно). Это означает, что вы можете позже docker execприсоединиться к нему ( ).
VonC

61

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

Чтобы контейнер работал в фоновом режиме, попробуйте запустить его с аргументом --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:/# 

22

Если невозможно запустить основной процесс снова (на достаточно долгое время), есть также возможность перейти 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:/#

Я выполнил тот же шаг, но недавно созданный контейнер недоступен из браузера, который был доступен раньше
Мухаммад Муаззам

1
Обратите внимание, что команда запускает bashпроцесс в контейнере. Вероятно, у вас раньше был запущенный веб-сервер, поэтому вам нужно будет проверить, какую команду нужно использовать для восстановления сервера.
Матиас Кун

10

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

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:/# 

Было бы полезно добавить текст, помогающий объяснить ваш ответ.
Лорен Ван Слоун

9

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

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

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

docker run -it node /bin/bash

Выход

root@cacc7897a20c:/# echo $SHELL
/bin/bash

5

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

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

docker ps -a --no-trunc 

ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33

3

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

  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в файле dockerfile или commandв следующем выражении, которое bashпо умолчанию используется в некоторых изображениях, например ubutu: 18.04.

docker run ubuntu:18.04 [command]


2

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

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

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

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


2

docker run -it <image_id> /bin/bash

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


1
Думаю, -dфлаг здесь опечатка?
Ян Басс,

1

Вот решение, когда контейнер докеров закрывается нормально, и вы можете редактировать файл 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для получения терминала контейнера.


"и вы можете редактировать Dockerfile": ключевой момент здесь. Проголосовали.
VonC

0

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

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


0

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.