Docker - контейнер не працює


89

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

  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

Відповіді:


31

79b3fa70b51dЗдається, контейнер робить лише echo.

Це означає, що він починається, лунає, а потім негайно виходить.

Наступна docker execкоманда не знайде її запущеною, щоб приєднатися до цього контейнера та виконати будь-яку команду: занадто пізно. Контейнер уже вийшов.

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

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


1
Привіт VonC, дякую за ваш коментар. Як я можу досягти входу в термінал зображення?
Незнайомець

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

50
Привіт, можеш пояснити, як ти вирішив цю проблему. Боюсь, ця відповідь не має багато сенсу
JayPex

2
@Jawad Запустивши busyboxwithtouch без будь-якого параметра, він за замовчуванням стає інтерактивною оболонкою (яка не виходить негайно). Це означає, що ви можете пізніше ( docker exec) приєднати до нього.
VonC

61

За замовчуванням контейнер 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:/# 

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 daemon запустить існуючий контейнер, статус якого може бути Createdабо Stopped.
  4. Коли ми виконаємо docker run, демон Docker закінчить його в два етапи: docker createі docker start.
  5. Коли docker stop, очевидно, демон docker зупинить контейнер. Таким чином контейнер буде в Stoppedстатусі.
  6. Виходячи з найважливіших, контейнер насправді уявляє, що в ньому триває тривалий процес. Коли процес завершується, процес зберігання контейнера також виходить. Таким чином статус цього контейнера буде Exited.

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

docker run ubuntu:18.04 [command]


2

Для тих, хто намагається зробити щось подібне за допомогою Dockerfile ...

Запуск у відключеному режимі не допоможе. Контейнер завжди вийде (зупиниться), якщо команда не блокує, це стосується bash.

У цьому випадку обхідним шляхом буде: 1. Зафіксувати отримане зображення: (ім'я_контейнера = ім'я контейнера, з якого потрібно базувати зображення, ім'я_ізображення = ім'я зображення, яке потрібно створити, докер фіксує ім'я_контейнера ім'я_імені 2. Використовуйте docker run для створення нового контейнера за допомогою нового образу із зазначенням команди, яку ви хочете запустити. Тут я запущу "bash": docker run -it image_name bash

Це дасть вам інтерактивний логін, який ви шукаєте.



1

Ось рішення, коли контейнер docker виходить нормально, і ви можете редагувати файл Docker.

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

І інструкції CMD, і ENTRYPOINT визначають, яка команда виконується під час запуску контейнера. ... Файл Docker повинен вказувати принаймні одну з команд CMD або ENTRYPOINT.

Коли ви створюєте зображення і не вказуєте жодної команди за допомогою CMD або ENTRYPOINT, виконується команда CMD або ENTRYPOINT базового зображення.

Наприклад, офіційний файл Ubuntu Docker має 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, побудоване з файлу Docker нижче -

FROM ubuntu
ENTRYPOINT echo hello 

Якщо вам потрібно перейти до терміналу цього зображення, вам потрібно буде підтримувати роботу контейнера, змінивши команду точки входу.

FROM ubuntu
ENTRYPOINT echo hello && sleep infinity 

Після нормального запуску контейнера за допомогою docker run IMAGE_IDви можете просто перейти до іншого терміналу та використовувати його docker exec -it CONTAINER_ID bashдля отримання терміналу контейнера.


"і ви можете редагувати файл Docker": ключовий момент тут. Прихильний.
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.