Сохранение историй команд в Docker контейнере

Зачем это нужно? При работе с долгоживущими контейнерами приходится запускать внутри контейнера какие то команды. Это могут быть запуск тестов, подключение к БД, сброс кеша или еще какие нибудь шаблонные команды. Все эти команды записываются в историю терминала, то есть в .bash_history. В следующий раз не нужно вводить команды полностью, можно подтянуть их из историй CTRL+R. Но после перезапуска контейнера вся эта история перезатирается. Чтобы упростить себе жизнь, сохраним эту историю.

Подготовка

Для примера возьмем образ MySQL

Docker-compose.yml будет выглядит так:

в папке ./docker будет лежат Dockerfile

./init/history.sh выглядит так

Что делают эти команды?

Меняет или добавляет /bin/bash как shell, который пользователь mysql будет использовать по умолчанию.

Записывает историю после каждого ввода команды, а не после выхода пользователя. Актуально для контейнера, который либо работает, либо перезапускается.

Добавляет команды в конец историй, иначе перезатирает файл при каждом вводе

Необязательная команда, красиво выводит историю при вызове команды history

Удаляет дубликаты команд. Полезно для шаблонных ls -la or cd ../

Место сохранения .bash_history. Полезно, чтобы не монтировать всю home папку, а лишь ту директорию где .bash_history сохранен

Запуск

Запускаем докер docker-compose up —build

Видим что скрипт отработал

сохранения bash_history docker

После захода в контейнер и ввода команд вся история будет сохраняться на хост машине в папке saved-history. После перезапуска контейнера не будет создаваться новый .bash_history, а подгрузиться из него

Скачать пример скрипта и увидеть структуру папок можно отсюда https://github.com/Carsak/bash-history