Не удается остановить или перезапустить контейнер докера

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

$ docker restart 5ba0a86f36ea
Error response from daemon: Cannot restart container 5ba0a86f36ea: [2] Container does not exist: container destroyed
Error: failed to restart containers: [5ba0a86f36ea]

Но когда я бегу

$ docker logs -f 5ba0a86f36ea

Я вижу журналы, поэтому, очевидно, контейнер существует. Есть идеи?

Редактировать:

извините, я забыл упомянуть об этом:

Когда я бегу docker ps -a Я вижу контейнер в рабочем состоянии. Однако приложение внутри него работает неправильно, поэтому я хочу перезапустить его или просто получить свежую версию этого приложения онлайн. Но когда я не могу остановить и удалить контейнер, я также не могу запустить и запустить новое приложение, которое будет слушать тот же порт.

15 ответов

Решение

Это выглядит как https://github.com/docker/docker/issues/12738, замеченный в Docker 1.6 или 1.7:

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

Мы часто видим эту проблему на хостах наших пользователей, когда они обновились с 1.5.0 до 1.6.0.
После обновления некоторые контейнеры не могут быть остановлены (давая 500 Server Error: Internal Server Error ("Cannot stop container xxxxx: [2] Container does not exist: container destroyed")) или принудительно уничтожен 500 Server Error: Internal Server Error ("Could not kill running container, cannot remove - [2] Container does not exist: container destroyed")). Процессы все еще работают на хосте.
Иногда это работает после перезапуска демона Docker.

Есть несколько обходных путей:

Я перепробовал все удаленные вызовы API для этого неубиваемого контейнера, и вот результаты:

  • json, stats, changes, top, logs вернул действительные ответы
  • stop, pause, wait, kill сообщил 404 (!)

После того, как я закончил с удаленным API, я дважды проверил docker ps (контейнер был все еще там), но затем я попытался убить докера, и это сработало! Контейнер был убит, и я мог его убрать.

Или же:

Что сработало, чтобы перезагрузить boot2docker на моем хосте. затем docker rm -f

$ boot2docker stop
$ boot2docker start
$ docker rm -f 1f061139ba04

boot2docker не было в моей машине. Итак, я нашел то, что сработало для меня.

$ sudo systemctl restart docker.socket docker.service
$ docker rm <container id>

Проверьте, работает ли он для вас.

Все докеры: start | restart | stop | rm --force | killкоманды могут не работать, если контейнер застрял. Вы всегда можете перезапустить демон докера. Однако, если у вас работают другие контейнеры, это может быть не вариант. Что вы можете сделать:

ps aux | grep <<container id>> | awk '{print $1 $2}'

Вывод содержит:

<<user>><<process id>>

Затем завершите процесс, связанный с контейнером, вот так:

sudo kill -9 <<process id from above command>>

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

Для всех на Mac, у кого установлен Docker Desktop. Мне удалось просто щелкнуть значок в трее и сказать Restart Docker. После перезапуска удалось удалить контейнеры.

Стоит знать:

Если вы запускаете сценарий ENTRYPOINT... сценарий будет работать с Shebang

#!/bin/bash -x

Но остановит контейнер от остановки

#!/bin/bash -xe

Наслаждаться

sudo aa-remove-unknown

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

Проверьте, есть ли какой-нибудь зомби-процесс, используя команду "top".

docker ps | grep <<container name>> 

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

ps -ef | grep <<container id>>

ps -ef|grep defunct | grep java

И убить контейнер по родительскому PID .

Если вы используете Mac и попробуйте это через терминал: используйте killall Docker выйти из Docker.

Перезагрузите его в папке Applications или с помощью open /Applications/Docker.app.

Впоследствии вы можете запустить docker rm <id> для соответствующего контейнера.

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

C:\ProgramData\Docker\containers\[container guid]

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

Ubuntu Остановите контейнер, используя идентификатор системного процесса. Получите идентификатор основного процесса, используя:

docker inspect -f '{{.State.Pid}}' идентификатор контейнера

Это вернет идентификатор как « 25430 ». Убейте это командой

судо убить -9 25430

Если вы используете Ubuntu, убедитесь, что docker-compose не установлен как оснастка. Это вызовет всевозможные случайные проблемы, включая перечисленные выше.

Снимаем защелку:

sudo snap remove docker-compose

И установить вручную из репозитория compose:

Инструкция по установке Docker Compose

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

если вы используете systemctl, вы можете перечислить все запущенные службы с помощью systemctl | grep runningи найти название службы.

затем используйте sudo systemctl disable <your_service_name>остановить это.

В моем случае я не мог удалить контейнер, созданный с помощью заданий кочевников, нет вывода для docker logs <ContainerID> и в целом похоже на замороженный.

до сих пор решение: sudo service docker restart, может кто-нибудь предложить лучший?

В моем случае, docker rm $(docker ps -aq) работает для меня.

Иногда это вызвано проблемой демона докеров. Решил проблему перезапуском службы докеров. В Linux:

      systemctl restart docker
Другие вопросы по тегам