我已经在用于 Lando 的 Docker 镜像中安装了 zsh 和 oh-my-zsh,但在使用 进入时我似乎无法更改默认 shell lando ssh
。
Oh-my-zsh 正在使用CHSH=yes
参数安装,但似乎没有效果。
我试过:
- 创建
.profile
包含以下内容的文件:
export SHELL=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$SHELL" -l
- 创建一个
.bash_profile
包含以下内容的:
export SHELL=/bin/zsh
exec /bin/zsh -l
...正如这个答案所建议的那样。
但我总是登录到/bin/bash
。
但是,当我输入时zsh
,我输入了 zshell 并且我的.zshrc
应用已成功。
我该如何修复此问题?
这是完整的 Docker 镜像构建脚本。它不包含上述尝试。我在容器本身中尝试了这些尝试,然后重新启动容器,并再次通过 SSH 连接到容器。镜像是公开的,可在此处获取: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
问题是它
lando ssh
忽略了您创建的那些配置文件。/etc/passwd
当你通过 SSH 连接到 Docker 容器时,它会查看该用户指定的 shell ,而不是你的点文件。你的.profile
或.bash_profile
技巧将不起作用,因为在获取这些文件之前,SSH 会话已经使用 bash 启动了。之前对我有用的解决方案:
在安装 zsh 之后、切换到 www-data 用户之前,将此添加到 Dockerfile 中。这实际上会在系统级别修改用户的 shell。
如果由于某种原因您无法重建图像,您还可以通过将以下内容添加到您的 .lando.yml 中来专门告诉 Lando 使用 zsh:
这样,当 Lando 使用 SSH 时,无论 /etc/passwd 中的内容是什么,它都会明确使用 zsh。
或者,您也可以在主机中创建一个 bash 别名:
然后在需要 zsh 时使用
lzsh
而不是。lando ssh
希望有帮助!
问题在于 Lando 在运行时没有使用 SSH。Lando
lando ssh
基本上是在后台运行docker exec sh
(或者如果它存在于容器中)。它直接执行 sh/bash 二进制文件,而不是将你登录到 shell 会话。bash
解决这个问题的方法是将你的 sh 和 bash 二进制文件符号链接到,
/bin/zsh
以便调用bash
或sh
实际执行zsh
。类似这样的操作,取决于你的容器,你可以将其添加到你的 Dockerfile 或 Lando
build_as_root
构建步骤中: