Instalei o zsh e o oh-my-zsh na minha imagem Docker que uso para o Lando, mas não consigo alterar o shell padrão ao entrar nele com lando ssh
.
Oh-my-zsh está sendo instalado com o CHSH=yes
parâmetro, mas parece que não tem efeito.
Tentei:
- Criando um
.profile
arquivo com o conteúdo:
export SHELL=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$SHELL" -l
- Criando um
.bash_profile
com o conteúdo:
export SHELL=/bin/zsh
exec /bin/zsh -l
... como sugerido nesta resposta .
Mas estou sempre conectado /bin/bash
.
Entretanto, quando digito zsh
, entro no zshell e meu .zshrc
comando é aplicado com sucesso.
Como posso consertar isso?
Aqui está o script completo de criação da imagem do Docker. Ele não contém as tentativas mencionadas acima. Eu as testei no próprio contêiner, reiniciando-o e conectando-o novamente por SSH. A imagem é pública e está disponível aqui: slimdeluxe/php:8.3-v1.1
FROM devwithlando/php:8.3-fpm-4
# Upgrade system
RUN apt-get update && apt-get -y upgrade
# Install system tools
RUN apt-get install -y tree nano
# Install locales
RUN apt-get install -y locales locales-all
# Add PHP extension helper
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
# Install PHP extensions
RUN chmod +x /usr/local/bin/install-php-extensions && sync && \
install-php-extensions sqlsrv pdo_sqlsrv
# Install Node.js
RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
RUN apt-get install -y nodejs
# Instal/update NPM
RUN npm install npm --global
# Install build dependencies for screen
RUN apt-get install -y build-essential libncurses5-dev automake texinfo wget \
git libtool pkg-config m4 perl
# Install newer Autoconf version
RUN wget https://ftp.gnu.org/gnu/autoconf/autoconf-2.71.tar.gz && \
tar -xzf autoconf-2.71.tar.gz && \
cd autoconf-2.71 && \
./configure && \
make && \
make install && \
cd .. && \
rm -rf autoconf-2.71 autoconf-2.71.tar.gz
# Download, compile and install screen 5.0.0
RUN wget https://ftp.gnu.org/gnu/screen/screen-5.0.0.tar.gz && \
tar -xzf screen-5.0.0.tar.gz && \
cd screen-5.0.0 && \
./autogen.sh && \
./configure && \
make && \
make install && \
cd .. && \
rm -rf screen-5.0.0 screen-5.0.0.tar.gz
# Install zsh and ohmyzsh
RUN apt-get install -y zsh
USER www-data
RUN cd /var/www && \
wget https://install.ohmyz.sh -O install.sh && \
CHSH=yes RUNZSH=no KEEP_ZSHRC=no sh install.sh && \
rm install.sh
# Create default .zshrc in home directory
RUN echo 'export ZSH="$HOME/.oh-my-zsh"\n\
ZSH_THEME="crunch"\n\
plugins=(git laravel)\n\
source $ZSH/oh-my-zsh.sh\n' > ~/.zshrc
USER root
O problema é que ele
lando ssh
ignora os arquivos de perfil que você criou.Ao usar SSH em um contêiner Docker, ele verifica o shell especificado
/etc/passwd
para o usuário, não seus dotfiles. Seus truques.profile
ou.bash_profile
não funcionarão porque a sessão SSH já foi iniciada com bash antes que esses arquivos sejam originados.Solução que funcionou para mim antes:
Adicione isso ao seu Dockerfile logo após instalar o zsh, mas antes de alternar para o usuário www-data. Isso, na verdade, modifica o shell do usuário no nível do sistema.
Se você não conseguir reconstruir a imagem por algum motivo, você também pode dizer ao Lando especificamente para usar zsh adicionando isto ao seu .lando.yml:
Dessa forma, quando o Lando faz SSH, ele usa explicitamente o zsh, independentemente do que estiver em /etc/passwd.
Como alternativa, você pode simplesmente criar um alias bash na sua máquina host:
Então use
lzsh
em vez delando ssh
quando quiser zsh.Espero que ajude!
O problema é que o Lando não está usando SSH ao executar o
lando ssh
. O Lando está basicamente executandodocker exec sh
(ou,bash
se existir no contêiner), em segundo plano. Ele está executando o binário sh/bash diretamente, sem efetuar login em uma sessão de shell.A solução para isso é criar um link simbólico para seus binários sh e bash para
/bin/zsh
que as chamadas parabash
oush
realmente executemzsh
.Algo assim, dependendo do seu contêiner, que você pode adicionar ao seu Dockerfile ou a uma
build_as_root
etapa de construção do Lando: