Зачем это нужно? При работе с долгоживущими контейнерами приходится запускать внутри контейнера какие то команды. Это могут быть запуск тестов, подключение к БД, сброс кеша или еще какие нибудь шаблонные команды. Все эти команды записываются в историю терминала, то есть в .bash_history. В следующий раз не нужно вводить команды полностью, можно подтянуть их из историй CTRL+R. Но после перезапуска контейнера вся эта история перезатирается. Чтобы упростить себе жизнь, сохраним эту историю.
Подготовка
Для примера возьмем образ MySQL
Docker-compose.yml будет выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
version: "3.2" services: db: build: ./docker restart: always environment: MYSQL_ROOT_PASSWORD: example MYSQL_DATABASE: test volumes: - ./saved-history:/tuning |
в папке ./docker будет лежат Dockerfile
1 2 3 4 5 6 7 |
FROM mysql:5.7 COPY ./init/history.sh /myscript/history.sh RUN /myscript/history.sh |
./init/history.sh выглядит так
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/bin/bash echo "history tuning START" usermod --shell /bin/bash mysql mkdir /home/mysql echo "PROMPT_COMMAND='history -a'">> /home/mysql/.bashrc echo "shopt -s histappend">> /home/mysql/.bashrc echo 'export HISTTIMEFORMAT="%h %d %H:%M:%S "'>> /home/mysql/.bashrc echo 'export HISTCONTROL=ignorespace:erasedups'>> /home/mysql/.bashrc echo 'export HISTFILE=/tuning/.bash_history'>> /home/mysql/.bashrc chown -R mysql: /home/mysql echo "history tuning END" |
Что делают эти команды?
1 2 3 |
usermod --shell /bin/bash mysql |
Меняет или добавляет /bin/bash как shell, который пользователь mysql будет использовать по умолчанию.
1 2 3 |
PROMPT_COMMAND='history -a' |
Записывает историю после каждого ввода команды, а не после выхода пользователя. Актуально для контейнера, который либо работает, либо перезапускается.
1 2 3 |
shopt -s histappend |
Добавляет команды в конец историй, иначе перезатирает файл при каждом вводе
1 2 3 |
export HISTTIMEFORMAT="%h %d %H:%M:%S |
Необязательная команда, красиво выводит историю при вызове команды history
1 2 3 |
export HISTCONTROL=ignorespace:erasedups |
Удаляет дубликаты команд. Полезно для шаблонных ls -la or cd ../
1 2 3 |
export HISTFILE=/tuning/.bash_history |
Место сохранения .bash_history. Полезно, чтобы не монтировать всю home папку, а лишь ту директорию где .bash_history сохранен
Запуск
Запускаем докер docker-compose up —build
Видим что скрипт отработал
После захода в контейнер и ввода команд вся история будет сохраняться на хост машине в папке saved-history. После перезапуска контейнера не будет создаваться новый .bash_history, а подгрузиться из него
Скачать пример скрипта и увидеть структуру папок можно отсюда https://github.com/Carsak/bash-history