Как был запущен данный docker контейнер?

Бывает ли у вас такое, что вы зашли к себе на сервак, вбили docker ps, видите какие-то 5 запушенных контейнеров, и совсем не понимаете, что это за образы, какой там base image, с какими флагами были запушены данные контейнеры и тд? Оказывается, что частично можно восстановить эту информацию из самого докера.

В первую очередь, надо сказать, что у вас проблема. Нет, не потому что восстановить информацию о запушенных контейнерах не получится. Проблема в процессах. Не должно быть такого, что кто-то запускает руками команду docker run … на серваке, да еще и не понятно с каким образом. Всё это должно быть автоматизировано (например, c помощью Kubernetes, или чем-то по проще), а также представлено as code. В общем, в мире уже GitOps.

Ладно, с проблемой разобрались. А что делать то? Как узнать хоть какую-то информацию об уже существующих контейнерах. На самом деле, докер даёт нам, как минимум, 2 команды для этого:

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

Rekcod

https://github.com/nexdrew/rekcod — даже само название говорит, что это такое 🙂 Рекод — это доркер наоборот. То есть, эта штука делает преобразование docker inspect → docker run (по уже запушенному контейнеру строит примерную команду docker run, с которой был запушен данный контейнер).

Воспользоваться rekcod довольно просто. Его можно натравить на какой-то контейнер, который у вас бежит на серваке. Либо вы можете скормить в rekcod вывод вызова docker inspect.

Dfimage

https://github.com/LanikSJ/dfimage — а эта утилитка поможет уже вам получить примерный Dockerfile образа, который вы каким-то образом получили (например, на вашем серваке запушен какой-то контейнер, и вы хотите узнать информацию про образ, который использовался для запуска этого контейнера).

Неутешительные выводы

Важно, что обе эти программы могут ошибаться, или вообще не работать. К сожалению, сам docker не даёт достаточного количества мета информации о запушенном контейнере, чтобы взаимно однозначно восстановить команду docker run, а также Dockerfile. Именно поэтому я и говорю, что не нужно доводить до состояния, когда вы что-то не знаете про ваши контейнеры — всё должно быть автоматизировано и представлено в git.

Категории: Программирование