119 lines
3.6 KiB
Bash
Executable File
119 lines
3.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# 容器运行时检测脚本
|
||
# 在执行strict模式测试前检测Docker/Podman是否可用
|
||
# 如果不可用,给出明确的修复指令
|
||
|
||
set -euo pipefail
|
||
|
||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||
CHECK_DOCKER="${1:-false}"
|
||
CHECK_PODMAN="${2:-false}"
|
||
|
||
echo "===== 容器运行时检测 ====="
|
||
echo ""
|
||
|
||
# 如果未指定检测选项,默认检测两者
|
||
if [[ "${CHECK_DOCKER}" == "false" && "${CHECK_PODMAN}" == "false" ]]; then
|
||
CHECK_DOCKER="true"
|
||
CHECK_PODMAN="true"
|
||
fi
|
||
|
||
DOCKER_AVAILABLE="false"
|
||
PODMAN_AVAILABLE="false"
|
||
|
||
# 检测Docker
|
||
if [[ "${CHECK_DOCKER}" == "true" ]]; then
|
||
echo "检测 Docker..."
|
||
if command -v docker >/dev/null 2>&1; then
|
||
if docker info >/dev/null 2>&1; then
|
||
echo " ✓ Docker 已安装且运行中"
|
||
DOCKER_AVAILABLE="true"
|
||
else
|
||
echo " ✗ Docker 已安装但无法连接(可能需要启动Docker daemon)"
|
||
echo " 解决方案: sudo systemctl start docker"
|
||
fi
|
||
else
|
||
echo " ✗ Docker 未安装"
|
||
fi
|
||
fi
|
||
|
||
# 检测Podman
|
||
if [[ "${CHECK_PODMAN}" == "true" ]]; then
|
||
echo ""
|
||
echo "检测 Podman..."
|
||
if command -v podman >/dev/null 2>&1; then
|
||
if podman info >/dev/null 2>&1; then
|
||
echo " ✓ Podman 已安装且运行中"
|
||
PODMAN_AVAILABLE="true"
|
||
else
|
||
echo " ✗ Podman 已安装但无法连接"
|
||
echo " 解决方案: podman system start"
|
||
fi
|
||
else
|
||
echo " ✗ Podman 未安装"
|
||
fi
|
||
fi
|
||
|
||
# 检测Docker Socket
|
||
echo ""
|
||
echo "检测 Docker Socket..."
|
||
DOCKER_SOCK="/var/run/docker.sock"
|
||
if [[ -S "${DOCKER_SOCK}" ]]; then
|
||
echo " ✓ ${DOCKER_SOCK} 存在"
|
||
else
|
||
echo " ✗ ${DOCKER_SOCK} 不存在或不是socket"
|
||
fi
|
||
|
||
# 检测Podman Socket
|
||
echo ""
|
||
echo "检测 Podman Socket..."
|
||
for uid in $(id -u) 0 1000; do
|
||
PODMAN_SOCK="/run/user/${uid}/podman/podman.sock"
|
||
if [[ -S "${PODMAN_SOCK}" ]]; then
|
||
echo " ✓ ${PODMAN_SOCK} 存在"
|
||
PODMAN_AVAILABLE="true"
|
||
break
|
||
fi
|
||
done
|
||
if [[ "${PODMAN_AVAILABLE}" != "true" ]]; then
|
||
echo " ✗ 未找到可用的Podman socket"
|
||
fi
|
||
|
||
# 最终结论
|
||
echo ""
|
||
echo "===== 检测结果 ====="
|
||
if [[ "${DOCKER_AVAILABLE}" == "true" || "${PODMAN_AVAILABLE}" == "true" ]]; then
|
||
echo "✓ 容器运行时可用"
|
||
if [[ "${DOCKER_AVAILABLE}" == "true" ]]; then
|
||
echo " - Docker: 可用"
|
||
export DOCKER_HOST="unix://${DOCKER_SOCK}"
|
||
fi
|
||
if [[ "${PODMAN_AVAILABLE}" == "true" ]]; then
|
||
echo " - Podman: 可用"
|
||
export DOCKER_HOST="unix:///run/user/$(id -u)/podman/podman.sock"
|
||
fi
|
||
echo ""
|
||
echo "可以执行 strict 模式测试"
|
||
exit 0
|
||
else
|
||
echo "✗ 无可用的容器运行时"
|
||
echo ""
|
||
echo "===== 修复指令 ====="
|
||
echo "严格模式测试需要Docker或Podman来启动PostgreSQL容器。"
|
||
echo ""
|
||
echo "方案1: 使用Docker"
|
||
echo " 1. 安装Docker: sudo apt install docker.io"
|
||
echo " 2. 启动Docker daemon: sudo systemctl start docker"
|
||
echo " 3. 将当前用户加入docker组: sudo usermod -aG docker \$(whoami)"
|
||
echo " 4. 重新登录或执行: newgrp docker"
|
||
echo ""
|
||
echo "方案2: 使用Podman(推荐,无需root)"
|
||
echo " 1. 安装Podman: sudo apt install podman"
|
||
echo " 2. 启动Podman服务: podman system start"
|
||
echo ""
|
||
echo "方案3: 跳过strict模式测试"
|
||
echo " 使用普通Maven测试命令,不带 -Dmigration.test.strict=true"
|
||
echo " 注意:这将导致关键安全测试被跳过,不推荐用于生产环境"
|
||
echo ""
|
||
exit 1
|
||
fi |