DEV Community

Cover image for HistÃģrico do Bash dentro de ContÊineres Docker
Lucas Perez
Lucas Perez

Posted on

HistÃģrico do Bash dentro de ContÊineres Docker

ðŸī󠁧ó Ēó Ĩó Ū󠁧ó ŋ English version of this text here!

NÃĢo sei vocÊs, mas eu adoro ter um ambiente de desenvolvimento dockerizado. NÃĢo ter que me preocupar com versionamento e dependÊncias quando for pulando de projeto em projeto ÃĐ muito bom.

Mas algo que eu nÃĢo gosto tanto assim ÃĐ quando eu saio do contÊiner e mais tarde volto nele e descubro que perdi o histÃģrico de todos os comandos anteriores, entÃĢo nÃĢo posso buscar mais nada nem com ctrl+R nem com seta pra cima/ctrl+P. Imagens de dor e sofrimento!

Decidi entÃĢo tentar manter esse histÃģrico, e para fazer isso, primeiro eu pensei, como que o bash faz pra saber os comandos anteriores?

No fim parece que hÃĄ uma variÃĄvel de ambiente chamada HISTFILE que contÃĐm o caminho para um arquivo de texto com o histÃģrico de comandos do bash. Aparentemente, por padrÃĢo ela ÃĐ configurada para $HOME/.bash_history.

OBS: Se o teu contÊiner rodar outro shell diferente do bash, teríamos que descobrir onde que esse outro shell guarda o seu histÃģrico.

EntÃĢo uma soluçÃĢo que encontrei foi de mudar essa variÃĄvel de ambiente pra algum outro lugar, algum lugar dentro do diretÃģrio do projeto que estou trabalhando pra evitar perdÊ-lo depois de parar o contÊiner.

Vamos supor que a imagem do docker cria um diretÃģrio /app com todo o conteÚdo do projeto dentro, eu poderia definir HISTFILE como sendo /app/.bash_history, e daí se mapearmos tudo com um volume, vamos ter um histÃģrico persistente entre sessÃĩes do docker. O nome do arquivo em si nem precisa ser .bash_history, poderia ser algo como /app/.docker_bash_history, por exemplo.

Pra começar um contÊiner com uma variÃĄvel específica, podemos passar a opçÃĢo -e:

docker exec -it -e HISTFILE=/app/.bash_history -v <volume> <...outras coisas...>
💎 āļŠāļēāļ§āđ€āļ™āđ‡āļ•āđāļŦāđˆāđāļŠāļĢāđŒ: lucassperez/bash history inside docker container jm - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ’Ž āļŠāļēāļ§āđ€āļ™āđ‡āļ•āđāļŦāđˆāđāļŠāļĢāđŒ: lucassperez/bash history inside docker container jm - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Se estivermos usando o Docker Compose, podemos ou passar um "env file" (um arquivo com variÃĄveis de ambiente) ou as variÃĄveis diretamente no docker-compose.yml (ou qualquer outro arquivo de configuraçÃĢo que estejas usando):

# arquivo de configuraçÃĢo de exemplo

services:
  app:
    build: .
    volumes:
      - .:/app # mapeando este volume para persistir as modificaçÃĩes no nosso novo arquivo de histÃģrico
    command: echo Oi!
    env_file: # podemos definir as variÃĄveis dentro deste arquivo .env
      - .env
    environment: # ou entÃĢo podemos passÃĄ-las diretamente aqui
      HISTFILE: /app/.bash_history
💎 āļŠāļēāļ§āđ€āļ™āđ‡āļ•āđāļŦāđˆāđāļŠāļĢāđŒ: lucassperez/bash history inside docker container jm - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ’Ž āļŠāļēāļ§āđ€āļ™āđ‡āļ•āđāļŦāđˆāđāļŠāļĢāđŒ: lucassperez/bash history inside docker container jm - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Um problema surge com essa soluçÃĢo, entretanto. Agora eu tenho um arquivo novo na raiz do meu projeto, um arquivo que o git vai ver, a menos que eu o coloque no nosso .gitignore, coisa que eu realmente acho que devíamos. Eu nÃĢo quero commitar meu histÃģrico e nem quero puxar o histÃģrico de outras pessoas, atÃĐ porque isso acabaria com o propÃģsito de ter um arquivo de histÃģrico. AlÃĐm disso, acabei de criar um novo arquivo na raiz, que pode ficar poluindo o diretÃģrio base do projeto. Talvez aches um outro lugar melhor para esses arquivos.

E isso ÃĐ praticamente tudo! Eu nÃĢo sei o quÃĢo ruim ou boa ÃĐ essa ideia, mas estou gostando atÃĐ aqui. Eu criei um diretorio novo na raiz do projeto, dotfiles/, que tem tambÃĐm outros arquivos parecidos, como .irb_history e .irbrc em um projeto ruby. Pra conseguir ter isso tudo funcionando, eu tive que adicionar as seguintes linhas ao arquivo dotfiles/.irbrc:

require 'irb/ext/save-history'
IRB.conf[:SAVE_HISTORY] = 10_000
IRB.conf[:HISTORY_FILE] = ENV['IRB_HISTFILE']
💎 āļŠāļēāļ§āđ€āļ™āđ‡āļ•āđāļŦāđˆāđāļŠāļĢāđŒ: lucassperez/bash history inside docker container jm - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ’Ž āļŠāļēāļ§āđ€āļ™āđ‡āļ•āđāļŦāđˆāđāļŠāļĢāđŒ: lucassperez/bash history inside docker container jm - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

E agora definir nÃĢo somente a variÃĄvel HISTFILE como tambÃĐm
as variÃĄveis IRBRC e IRB_HISTFILE, assim:

HISTFILE=/app/dotfiles/.bash_history
IRBRC=/app/dotfiles/.irbrc
IRB_HISTFILE=/app/dotfiles/.irb_history
💎 āļŠāļēāļ§āđ€āļ™āđ‡āļ•āđāļŦāđˆāđāļŠāļĢāđŒ: lucassperez/bash history inside docker container jm - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ’Ž āļŠāļēāļ§āđ€āļ™āđ‡āļ•āđāļŦāđˆāđāļŠāļĢāđŒ: lucassperez/bash history inside docker container jm - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Uma nota importante sobre o IRB, se vocÊ deixar o arquivo .irbrc na raiz, toda vez que vocÊ abrir o IRB, ele vai usar o .irbrc do projeto, visto que ele ÃĐ encontrado primeiro. Isso pode nÃĢo ser desejado, talvez vocÊ queira usar o seu prÃģprio IRB normal. Nesse caso, colocar o arquivo .irbrc dentro de outro diretÃģrio, como dotfiles/, passa a ser essencial.

Obrigado por lerem! (:

Top comments (1)

💎 āļŠāļēāļ§āđ€āļ™āđ‡āļ•āđāļŦāđˆāđāļŠāļĢāđŒ: lucassperez/bash history inside docker container jm - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™
 
rafelluiz profile image
rafelluiz •

Muito top, estou salvando na pasta tmp do projeto.