Minikube启动报DRV_NOT_HEALTHY错误,手动执行Docker组命令恢复求助
问题描述
通过Bash脚本完成Docker、Skaffold、Minikube和kubectl的安装后,启动Minikube时出现以下错误:
Exiting due to DRV_NOT_HEALTHY: Found driver(s) but none were healthy. See above for suggestions how to fix installed drivers.
但手动执行脚本中已有的命令sudo usermod -aG docker $USER && newgrp docker后,Minikube即可正常启动。完整安装脚本如下:
#!/bin/bash function run_command { local cmd="$1" local spinner_text="$2" echo -n "$spinner_text" { eval "$cmd" &>/dev/null } & local spinner=$! local spin='-\|/' local i=0 while kill -0 $spinner 2>/dev/null do i=$(( (i+1) %4 )) printf "\r$spinner_text ${spin:$i:1}" sleep .1 done wait $spinner local exit_code=$? if [[ $exit_code != 0 ]]; then echo "Error: $cmd failed with exit code $exit_code." exit $exit_code fi echo "Done." } # Update package lists run_command "apt-get update" "Updating package lists... " # Install Docker run_command "apt-get install -y docker.io" "Installing Docker... " # Install Skaffold run_command "curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64 && chmod +x skaffold && sudo mv skaffold /usr/local/bin" "Installing Skaffold... " # Install Minikube run_command "curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin" "Installing Minikube... " # Install kubectl run_command "curl -LO https://storage.googleapis.com/kubernetes-release/release/\`curl -L https://storage.googleapis.com/kubernetes-release/release/stable.txt\`/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/" "Installing kubectl... " # Add the current user to the Docker group run_command "sudo usermod -aG docker $USER && newgrp docker" "Adding user to Docker group... " # Add virtual host to /etc/hosts run_command "echo '192.168.49.2 hcms.dev' | sudo tee -a /etc/hosts" "Adding virtual host to /etc/hosts... " echo "Installation complete."
原因分析
脚本中的newgrp docker命令是在run_command函数的子shell中执行的(函数内用后台进程+eval执行命令),子shell的组切换不会影响父shell。这意味着脚本执行完成后,当前终端会话的用户组并未实际切换到docker组,导致Minikube启动时无法正常访问Docker驱动,触发DRV_NOT_HEALTHY错误。而手动执行该命令时,是在当前shell中直接生效,因此能解决问题。
解决建议
1. 调整用户组配置的执行逻辑
将newgrp docker从run_command函数中剥离出来,直接在父shell中执行,确保组切换生效:
# 替换原有的用户组配置代码 # Add the current user to the Docker group run_command "sudo usermod -aG docker $USER" "Adding user to Docker group... " # 单独执行newgrp,确保当前shell生效docker组权限 echo -n "Switching to docker group... " newgrp docker &>/dev/null echo "Done."
2. 提示用户重新登录以永久生效权限
usermod添加用户组后,只有重新登录会话才能让权限永久生效(newgrp只是临时切换当前shell的组)。在脚本末尾添加提示:
echo "Installation complete." echo "提示:为了让Docker组权限永久生效,请注销当前会话后重新登录。"
3. 指定Minikube使用Docker驱动
启动Minikube时明确指定驱动为Docker,避免自动选择其他可能不健康的驱动:
minikube start --driver=docker
修改后的完整脚本示例
#!/bin/bash function run_command { local cmd="$1" local spinner_text="$2" echo -n "$spinner_text" { eval "$cmd" &>/dev/null } & local spinner=$! local spin='-\|/' local i=0 while kill -0 $spinner 2>/dev/null do i=$(( (i+1) %4 )) printf "\r$spinner_text ${spin:$i:1}" sleep .1 done wait $spinner local exit_code=$? if [[ $exit_code != 0 ]]; then echo "Error: $cmd failed with exit code $exit_code." exit $exit_code fi echo "Done." } # Update package lists run_command "apt-get update" "Updating package lists... " # Install Docker run_command "apt-get install -y docker.io" "Installing Docker... " # Install Skaffold run_command "curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64 && chmod +x skaffold && sudo mv skaffold /usr/local/bin" "Installing Skaffold... " # Install Minikube run_command "curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin" "Installing Minikube... " # Install kubectl run_command "curl -LO https://storage.googleapis.com/kubernetes-release/release/\`curl -L https://storage.googleapis.com/kubernetes-release/release/stable.txt\`/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/" "Installing kubectl... " # Add the current user to the Docker group run_command "sudo usermod -aG docker $USER" "Adding user to Docker group... " # Switch to docker group in current shell echo -n "Switching to docker group... " newgrp docker &>/dev/null echo "Done." # Add virtual host to /etc/hosts run_command "echo '192.168.49.2 hcms.dev' | sudo tee -a /etc/hosts" "Adding virtual host to /etc/hosts... " echo "Installation complete." echo "提示:为了让Docker组权限永久生效,请注销当前会话后重新登录。"
内容的提问来源于stack exchange,提问作者Vladimer Grigalashvili

