Docker совет №22: Получаем список изменений в контейнере
Apr 26, 2018 07:59 · 292 words · 2 minute read
Бывают случаи, когда вносятся изменения внутри уже запущенного docker-контейнера, после чего нужно увидеть, насколько измененный контейнер отличается от оригинального образа. Давайте разберемся!
Всем хорошо известно, что контейнеры являются идемпотентными - внесенные изменения внутри запущенного контейнера будут утеряны при следующем запуске контейнера. Именно поэтому, все внесенные изменения (если, конечно, в них есть смысл и они привели к нужному результату) внутри запущенного docker-контейнера необходимо дописать в Dockerfile
и пересобрать docker-образ. Как же получить список изменений внутри контейнера?
Все просто - используйте команду docker container diff <container_name>
. Рассмотрим конкретный пример - запускаем docker-контейнер из образа alpine и вносим некоторые изменения:
docker run --rm -it --name difftest alpine:3.7
> mkdir exampledir
> cd /tmp
> touch hello.txt
Во второй вкладке терминала проверим, что же изменилось внутри docker-контейнера с именем difftest
:
docker container diff difftest
> A /exampledir
> C /root
> A /root/.ash_history
> C /tmp
> A /tmp/hello.txt
При выводе результата команды docker container diff <container_name>
можно увидеть, что каждая строка вначале содержит один из трех возможных символов - A,C,D:
- A - файл (помним, что с точки зрения Linux каталог это тоже файл) был добавлен;
- C - файл был изменен;
- В - файл был удален.
В нашем примере мы ничего не удаляли, поэтому в результате вывода есть только строки с символами A и С. Файл /root/.ash_history
, как вы наверняка уже догадались, это стандартный файл с историей команд.
Команда diff
выведет в результате только те файлы, которые были добавлены/изменены/удалены. Если нужно получить всю историю действий в запущенном docker-контейнере, то можно воспользоваться такой командой:
docker exec difftest cat /root/.ash_history
Обе команды имеют разное предназначение, поэтому в каждом конкретном случае лучше пользоваться более подходящей командой. Благодаря команде diff
можно быстро получить представление о том, что изменялось, а благодаря файлу с историей команд можно воспроизвести каждый шаг вносимых изменений.