Как продолжить контейнер Docker, который вышел


263

Рассматривать:

docker run -it centos /bin/bash

Я нажал Ctrl+, Dчтобы выйти.

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

Единственный метод

docker commit `docker ps -q -l` my_image
docker run -it my_image /bin/bash

Я прав? Есть ли лучший метод? (Я использую докер 0.8.0.)


1
Вы пытались присвоить имя контейнеру и использовать это имя для управления им? Кстати, под «выходом из него» вы имеете в виду отсоединение от него, верно?
Эрик Платон

12
Docker - это инструмент для программирования, по крайней мере, так я его использую. Если большинство не согласны, то кто-то должен сказать Docker не указывать StackOverflow как место, где можно задавать вопросы. Я уверен, что это не первый вопрос типа DevOps, который может возникнуть здесь или у SuperUser.
Тед М. Янг

5
Docker - это инструмент для разработчиков. Это уже тег 'docker' здесь. Итак, я думаю, что это уместно спросить в stackoverflow. Я использую его для создания образа, который требует сборки из чистой среды.
Даниэль YC Лин

6
Я хотел бы, чтобы люди, которые отметили это как "не по теме", объяснили почему!
jpetazzo

2
Чтобы поддержать этот вопрос как не относящийся к теме: meta.stackoverflow.com/q/276579/210336 и meta.stackoverflow.com/q/271279/210336 .
Маттис Вессельс

Ответы:


291

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

docker start  `docker ps -q -l` # restart it in the background
docker attach `docker ps -q -l` # reattach the terminal & stdin

3
кратко изложить в одной строке: docker start `docker ps -q -l` && docker attach `docker ps -q -l`
Даниэль YC Лин

7
Ознакомить одной строкой: docker start -i $(docker ps -q -l). ;-) Именование может помочь лучше контролировать, какой контейнер выбран. -lполучите последнее, хорошо ...
Эрик Платон

103
Для новичков в Linux `docker ps -q -l`это расширение. Он будет заменен идентификатором последнего созданного (-l) контейнера Docker. -q просто подавляет другую информацию (id у постели), обычно выводимую с помощью `docker ps`. ---- примечание: Backtick не является кавычкой, он имеет особое значение. Все, что вы вводите между обратными
галочками,

1
Я обнаружил, что контейнер входит в состояние, Created...из которого он не может быть запущен с docker start .... Однако его можно перезапустить с помощьюdocker restart ...
Вольтер

2
Примечание: -lтолько получает "последний" докер. Если вы похожи на меня и docker ps -aпоказывает более чем одну вещь, которую вам нужно запустить, то вы можете перезапустить «все» (-a) из них, изменив приведенную выше команду на docker start `docker ps -q -a`. -qпросто делает это "тихо" (не выходной журнал).
Рок Ли

148
docker start -a -i `docker ps -q -l`

Объяснение:

docker startзапуск контейнера (требуется имя или идентификатор)
-aприсоединение к контейнеру в
-iинтерактивном режиме
docker psСписок контейнеров
-qсписок только идентификаторов контейнеров
-lсписок только последний созданный контейнер


docker ps -q -l, он дает идентификатор контейнера последнего созданного, даже если он находится в состоянии запуска.
Дхарманг

что такое так называемое «прикрепление» к контейнеру? "Прикрепить"?
Skytree

49

Использование:

docker start $(docker ps -a -q --filter "status=exited")

Это запустит все контейнеры, которые находятся в состоянии выхода.

docker exec -it <container-id> /bin/bash

Это подключится к конкретному контейнеру.


2
Я обнаружил, что это единственное, что сработало для меня ... из-за той решающей второй линии. docker exec -it <container id> /bin/bash(или просто bash).
Бароп

Это сработало для меня, но я должен был запустить его два раза, так как у меня было два контейнера. Так что, если первый запускается, а второй получает ошибку. просто нажмите ту же команду еще раз, и она должна запустить следующий контейнер.
Андрия Дж. Фуркидни

20

Если вы хотите сделать это несколькими, легко запоминающимися командами:

  1. список остановленных контейнеров:

docker ps -a

  1. скопируйте имя или идентификатор контейнера контейнера, к которому вы хотите присоединить, и запустите контейнер с:

docker start -i <name/id>

-iФлаг говорит докер прикрепить к стандартному вводу контейнера.

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

docker start <name/id>
docker exec -it <name/id> /bin/sh

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


Недооцененный ответ, это помогло мне найти контейнер, который я искал, намного проще, чем «ответ» на этот вопрос.
Николас Лабрек

3
Error response from daemon: Container <id> is not running
Cerin

14

Если вы хотите продолжить только один Docker-контейнер с известным именем:

docker start  `docker ps -a -q --filter "name=elas"`

1
спасибо @ Нельсон, это очень полезно для меня, чтобы начать конкретный докер
SACHIN CHAVAN

В этом случае вы можете просто запустить docker start <name>где <имя> - это имя вашего контейнера. По крайней мере, с докером v19.03.8
Дон Фумаре

13

Следуй этим шагам:

  1. Выполните команду ниже, чтобы увидеть, что все службы контейнеров работают и остановлены. Опция -aдается, чтобы увидеть, что контейнер также останавливается

    docker ps -a
    
  2. Затем запустите Docker-контейнер по имени container_idили тегу контейнера.

    docker start <CONTAINER_ID> or <NAMES>
    

    введите описание изображения здесь

    Скажем из рисунка выше, идентификатор контейнера 4b161b302337
    Итак, команда для запуска

    docker start 4b161b302337
    
  3. Можно проверить, работает ли контейнер с

    docker ps
    

9

Если у вас есть именованный контейнер, его можно запустить, запустив

docker container start container_name

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

docker ps -a

5

Эти команды будут работать для любого контейнера (не только для последних вышедших). Этот способ будет работать даже после перезагрузки вашей системы. Для этого эти команды будут использовать «идентификатор контейнера».

шаги:

  1. Перечислите все докеры с помощью этой команды и запишите идентификатор контейнера, который вы хотите перезапустить: docker ps -a

  2. Запустите свой контейнер, используя идентификатор контейнера: docker start <container_id>

  3. Присоедините и запустите свой контейнер: docker attach <container_id>

ПРИМЕЧАНИЕ: работает на Linux


1

по имени

sudo docker start bob_the_container

или по идентификатору

sudo docker start aa3f365f0f4e

это перезапускает остановленный контейнер, используйте -i для подключения STDIN контейнера или вместо -i вы можете присоединить к сеансу контейнера (если вы запускаете с -it)

sudo docker attach bob_the_container

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