Tenho uma imagem Docker que instala o rvm . No Dockerfile
, acrescento as seguintes linhas ao ~/.bashrc
do usuário.
export PATH="$PATH:$HOME/.rvm/bin"
source "$HOME/.rvm/scripts/rvm"
Também faço o bash atuar como shell de login.
SHELL ["/bin/bash", "-lc"]
Depois, crio um contêiner usando o Docker Compose e executo um script de shell como o usuário em questão.
entrypoint:
- /bin/bash
- '-lc'
command:
- ~/.local/bin/ci
No script ci
, se eu fizer isso source ~/.bashrc
, o script não consegue encontrar o rvm
executável. No entanto, se eu especificamente source "$HOME/.rvm/scripts/rvm"
, o script roda com sucesso.
Minha pergunta é: o .rvm/scripts
é parte do .bashrc
, então, por que o sourcing .bashrc
não funciona?
Você não postou seu .bashrc completo, mas pela saída do bash -x fica claro que seu .bashrc está verificando uma sessão interativa com código como
Esta é uma verificação padrão que impede que .bashrc entre em vigor em shells não interativos. O .bashrc de origem retorna antes de executar quaisquer outros comandos (incluindo os que você adicionou).
Para evitar isso, você pode adicionar seu código acima dessas linhas para que ele seja executado mesmo em um contexto não interativo. No entanto, uma solução melhor seria explicitamente fornecer um novo arquivo para evitar mexer com .bashrc e amigos.
Executar o script CI com
-x
mostrou que o.bashrc
é de fato originado, então, por que a última declaração nele não funcionou, não tenho ideia. Acabei anexandosource "$HOME/.rvm/scripts/rvm
ao~/.profile
(em vez de.bashrc
), e executando o script CI com um#!/bin/bash -l
shebang. Isso pareceu ter resolvido o problema do executável não encontrado, embora a pergunta original que fiz permaneça sem resposta.-x
rastro: