Docker Compose是否会覆盖macOS的PATH或bash_profile?
Docker不会直接覆盖你的~/.bash_profile或其他Shell配置文件。你遇到的问题大概率是nvm的环境变量未在Shell启动时自动加载,而非Docker修改了你的配置文件。
可能的原因及解决方法:
nvm初始化代码未正确写入Shell配置文件
如果你的~/.bash_profile或~/.bashrc中没有添加nvm的初始化命令,每次重启Shell后nvm的环境变量(包括PATH里的node路径)就会丢失。解决方法是将以下代码添加到~/.bash_profile中:# 针对brew安装的nvm source $(brew --prefix nvm)/nvm.sh添加后执行
source ~/.bash_profile生效,后续重启电脑就不需要手动执行该命令了。Shell启动模式导致配置文件未加载
macOS默认Terminal是登录Shell,会加载~/.bash_profile;但如果使用iTerm2或其他终端,可能默认是非登录Shell,此时只会加载~/.bashrc。如果你的nvm初始化代码只在~/.bash_profile里,非登录Shell就无法加载。解决方法:- 将nvm初始化代码复制到
~/.bashrc中; - 或者在
~/.bashrc末尾添加source ~/.bash_profile,让非登录Shell也加载登录Shell的配置。
- 将nvm初始化代码复制到
Docker Compose未直接影响主机环境变量
Docker Compose的environment或env_file配置只会修改容器内部的环境变量,不会影响主机的PATH或Shell配置。除非你在启动容器的自定义脚本中手动修改了主机的环境变量(这种情况非常罕见),否则Docker不会导致你的node -v等命令失效。PATH被其他脚本覆盖
检查~/.bash_profile或~/.bashrc中是否有其他脚本在nvm初始化之后修改了PATH,导致nvm添加的node路径被挤到后面甚至覆盖。可以在配置文件末尾添加echo $PATH,重启Shell后查看输出,确认~/.nvm/versions/node/xxx/bin是否在PATH列表中。
内容的提问来源于stack exchange,提问作者howard wolowitz

