Не удается остановить или перезапустить контейнер докера
При попытке остановить или перезапустить докер-контейнер я получаю следующее сообщение об ошибке:
$ 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:
я забыл, что запустил контейнер как системную службу.
поэтому, если я остановлю или уничтожу контейнер, служба вернет его.
если вы используете systemctl, вы можете перечислить все запущенные службы с помощью
systemctl | grep running
и найти название службы.
затем используйте
sudo systemctl disable <your_service_name>
остановить это.
В моем случае я не мог удалить контейнер, созданный с помощью заданий кочевников, нет вывода для docker logs <ContainerID>
и в целом похоже на замороженный.
до сих пор решение: sudo service docker restart
, может кто-нибудь предложить лучший?
Иногда это вызвано проблемой демона докеров. Решил проблему перезапуском службы докеров. В Linux:
systemctl restart docker