Ao usar o Docker para desenvolvimento, especialmente o Docker Compose, os comandos que costumavam ser curtos e agradáveis nos dias anteriores ao Docker acabam se tornando mais longos para encaminhar comandos por meio de um contêiner em execução, por exemplo
docker-compose run web rails g controller users
Embora existam algumas soluções óbvias, como definir aliases em sua configuração de shell, por exemplo
alias web="docker-compose run web"
isso exige que você adote convenções globais que nem sempre se aplicam se você estiver colaborando em vários projetos.
Embora o seguinte hack do shell possa certamente ser usado em qualquer contexto, eu o uso principalmente para definir o escopo de comandos para árvores de diretório específicas em minha caixa de desenvolvimento. Assim, ao sair da árvore, tudo fica limpo, evitando o inchaço global.
Primeiro, adicione as seguintes funções à configuração do bash – diretamente em ~ / .bashrc ou em um arquivo separado que é então obtido por seu .bashrc:
function on_leave_dir() {
if [ -e .aliases ]; then
export OLD_ALIAS_DIR="$PWD"
fi
}
function on_enter_dir() {
if [ -n "$OLD_ALIAS_DIR" ] && ! is_subdirectory "$PWD" "$OLD_ALIAS_DIR" ; then
aliases="$OLD_ALIAS_DIR/.aliases"
while IFS=':' read -r key value || [ -n "$key" ]; do
unalias "$key" > /dev/null 2>&1
done < $aliases
unset OLD_ALIAS_DIR
echo "Unloaded local aliases"
fi
if [ -e .aliases ]; then
while IFS=':' read -r key value || [ -n "$key" ]; do
alias "$key"="${value##*( )}"
done < ".aliases"
echo "Loaded local aliases"
fi
}
function is_subdirectory() {
local child="$1"
local parent="$2"
if [[ "${child##${parent}}" != "$child" ]]; then
return 0
else
return 1
fi
}
function cd() {
on_leave_dir
builtin cd "$@"
on_enter_dir
}
Em seguida, em qualquer diretório que você gostaria de acionar um ou mais aliases, adicione um arquivo .aliases, usando um formato de valor-chave simples:
logs: docker-compose logs web
rails: docker-compose run --rm web rails
Agora, sempre que entrar nesse diretório, você pode executar os comandos (curtos e agradáveis):
rails g controller users
Embora o comando acima pareça um executável normal do Rails, na verdade é um alias que está encaminhando o comando para o executável do Rails em execução dentro do meu contêiner do Docker.
Você também pode redefinir os aliases em outros diretórios usando os mesmos nomes de chave sem conflitos.