Як продовжити контейнер 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

Маю рацію? Чи є кращий метод? (Я використовую docker 0.8.0.)


1
Чи намагалися ви призначити ім’я контейнеру та використовуєте це ім'я для керування ним? До речі, під «виходом з нього» ви маєте на увазі відірватися від нього, правда?
Ерік Платон

12
Docker - це інструмент для програмування, принаймні так я цим і користуюся. Якщо більшість не погоджується, то хтось повинен сказати Докеру не вказувати на StackOverflow як місце для запитання. Я впевнений, що це не перше питання "DevOps", яке може перейти або сюди, або SuperUser.
Тед М. Янг

5
Docker - це інструмент для розробників. Тут уже є тег "docker". Отже, я вважаю, що це правильно запитати в stackoverflow. Я використовую його для створення зображень, які потребують побудови з чистого середовища.
Daniel YC Lin

6
Я б хотів, щоб люди, які позначили це як "поза темою", пояснювали б, чому!
jpetazzo

2
Щоб підтримати це питання як поза тему: meta.stackoverflow.com/q/276579/210336 та meta.stackoverflow.com/q/271279/210336 .
Matthijs Wessels

Відповіді:


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`
Daniel YC Lin

7
Ознайомити одним рядком: docker start -i $(docker ps -q -l). ;-) Іменування може допомогти краще контролювати, який контейнер обраний. -lОтримайте останнє, добре ...
Ерік Платон

103
Для тих, хто є новим для Linux, `docker ps -q -l`біт - це розширення. Він буде замінений ідентифікатором останнього створеного контейнера докера (-l). -q просто пригнічує іншу інформацію (замість ідентифікатора), яку зазвичай виводить `docker ps`. ---- примітка: Backtick - це не лапок, він має дуже особливе значення. Все, що ви вводите між backticks, оцінюється (виконується) оболонкою перед основною командою - unix.stackexchange.com/questions/27428/…
bnieland

1
Я виявив, що контейнер переходить у стан, Created...з якого він не може бути запущений з a 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(або просто баш).
барлоп

Це працювало для мене, але я хотів запустити його два рази, оскільки у мене було два контейнери. Тож якщо перший запускається, а другий отримує помилку. просто знову натисніть ту ж команду, і вона повинна запустити наступний контейнер.
Andrija J Fourkidney

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Є оболонка , як правило , доступні з альпійськими на основі зображень.


Занижена відповідь, це допомогло мені знайти контейнер, який я шукав набагато простіше, ніж "відповідь" на це питання.
nicholas labrecque

3
Error response from daemon: Container <id> is not running
Серін

14

Якщо ви хочете продовжити рівно один контейнер Docker з відомим ім'ям:

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

1
дякую @Nelson це дуже корисно для мене, щоб почати конкретний докер
SACHIN CHAVAN

У цьому випадку ви можете просто запустити, docker start <name>де <ім'я> - ім'я вашого контейнера. Принаймні, з docker v19.03.8
Дон Фумар

13

Виконайте такі дії:

  1. Запустіть команду нижче, щоб побачити, що всі служби контейнерів працюють і зупиняються. Дається -aможливість бачити, що контейнер також зупиняється

    docker ps -a
    
  2. Потім запустіть контейнер докер або через container_idімена тегів контейнерів

    docker start <CONTAINER_ID> or <NAMES>
    

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

    Скажіть із наведеного малюнка, ідентифікатор контейнера 4b161b302337
    Отже, команда, яку потрібно запустити, - це

    docker start 4b161b302337
    
  3. Можна перевірити, чи працює контейнер

    docker ps
    

9

Якщо у вас є названий контейнер, його можна запустити запуском

docker container start 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 контейнера або замість -я ви можете приєднати до сеансу контейнера (якщо ви працюєте з -it)

sudo docker attach bob_the_container

0
docker start `docker ps -a | awk '{print $1}'`

Це запустить усі контейнери, які знаходяться у стані "Вийшов"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.