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

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

$ 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

Я вижу журналы, поэтому контейнер явно существует. Любые идеи?

Edit:

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

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

Ответ 1

Это выглядит как 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")). Процессы все еще запущены на хосте.
Иногда он работает после перезапуска демона докеров.

Есть некоторые обходные пути:

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

  • 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

Ответ 2

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

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

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

Ответ 3

Стоит знать:

Если вы используете ENTRYPOINT script... script будет работать с shebang

#!/bin/bash -x

Но остановит контейнер от остановки с помощью

#!/bin/bash -xe

Ответ 4

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

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

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

<<user>><<process id>>

Затем завершите процесс, связанный с контейнером, следующим образом:

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

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

Ответ 5

Если ничего не помогает, вы можете удалить рабочий стол Docker в Windows и Mac, чтобы остановить контейнер.

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

Ответ 6

Наслаждайтесь

sudo aa-remove-unknown

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