From 932038ab1d2d89956a7919b100627178439ecc94 Mon Sep 17 00:00:00 2001 From: "sundapeng.sdp" Date: Tue, 14 Oct 2025 12:16:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Ddocker-compose?= =?UTF-8?q?=E4=B8=AD=E9=85=8D=E7=BD=AE=E8=B7=AF=E5=BE=84=E4=B8=8D=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refs #20 --- src/metric/tests/docker-compose.yml | 14 +-- src/metric/tests/scripts/01_start_services.sh | 9 +- .../tests/scripts/common/init-directories.sh | 71 +++++------- src/metric/tests/scripts/common/start-all.sh | 57 +++++---- src/metric/tests/scripts/common/stop-all.sh | 76 ++++++------ src/metric/tests/scripts/load-images.sh | 109 ++++++++++++++++++ src/metric/tests/scripts/save-images.sh | 93 +++++++++++++++ 7 files changed, 316 insertions(+), 113 deletions(-) create mode 100755 src/metric/tests/scripts/load-images.sh create mode 100755 src/metric/tests/scripts/save-images.sh diff --git a/src/metric/tests/docker-compose.yml b/src/metric/tests/docker-compose.yml index 9cae344..98e4140 100644 --- a/src/metric/tests/docker-compose.yml +++ b/src/metric/tests/docker-compose.yml @@ -25,8 +25,8 @@ services: - "${FTP_DATA_PORT:-20}:20" - "21100-21110:21100-21110" volumes: - - ${DATA_ROOT:-./data}/ftp:/private/argus/ftp - - ${DATA_ROOT:-./data}/etc:/private/argus/etc + - ${DATA_ROOT:-/private}/argus/metric/ftp:/private/argus/ftp + - ${DATA_ROOT:-/private}/argus/etc:/private/argus/etc networks: default: ipv4_address: 172.30.0.40 @@ -54,8 +54,8 @@ services: ports: - "${PROMETHEUS_PORT:-9090}:9090" volumes: - - ${DATA_ROOT:-./data}/prometheus:/private/argus/metric/prometheus - - ${DATA_ROOT:-./data}/etc:/private/argus/etc + - ${DATA_ROOT:-/private}/argus/metric/prometheus:/private/argus/metric/prometheus + - ${DATA_ROOT:-/private}/argus/etc:/private/argus/etc networks: default: ipv4_address: 172.30.0.41 @@ -85,8 +85,8 @@ services: ports: - "${GRAFANA_PORT:-3000}:3000" volumes: - - ${DATA_ROOT:-./data}/grafana:/private/argus/metric/grafana - - ${DATA_ROOT:-./data}/etc:/private/argus/etc + - ${DATA_ROOT:-/private}/argus/metric/grafana:/private/argus/metric/grafana + - ${DATA_ROOT:-/private}/argus/etc:/private/argus/etc networks: default: ipv4_address: 172.30.0.42 @@ -112,7 +112,7 @@ services: - FTP_PASSWORD=${FTP_PASSWORD:-ZGClab1234!} - FTP_PORT=${FTP_PORT:-21} volumes: - - ${DATA_ROOT:-./data}/agent:/private/argus/agent + - ${DATA_ROOT:-/private}/argus/agent:/private/argus/agent command: sleep infinity networks: default: diff --git a/src/metric/tests/scripts/01_start_services.sh b/src/metric/tests/scripts/01_start_services.sh index 3cd54b6..7012224 100755 --- a/src/metric/tests/scripts/01_start_services.sh +++ b/src/metric/tests/scripts/01_start_services.sh @@ -3,8 +3,15 @@ set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +# 解析参数 +REBUILD_FLAG="" +if [[ "$1" == "--rebuild" || "$1" == "-r" ]]; then + REBUILD_FLAG="--rebuild" + echo "[01] 启用强制重新构建模式" +fi + echo "[01] 启动所有服务..." -bash "$SCRIPT_DIR/common/start-all.sh" +bash "$SCRIPT_DIR/common/start-all.sh" $REBUILD_FLAG echo "[01] 等待服务就绪..." sleep 5 diff --git a/src/metric/tests/scripts/common/init-directories.sh b/src/metric/tests/scripts/common/init-directories.sh index 6a31acf..084c52a 100755 --- a/src/metric/tests/scripts/common/init-directories.sh +++ b/src/metric/tests/scripts/common/init-directories.sh @@ -22,70 +22,55 @@ PROMETHEUS_UID=${PROMETHEUS_UID:-2133} PROMETHEUS_GID=${PROMETHEUS_GID:-2015} GRAFANA_UID=${GRAFANA_UID:-2133} GRAFANA_GID=${GRAFANA_GID:-2015} -DATA_ROOT=${DATA_ROOT:-$TEST_DIR/data} +DATA_ROOT=${DATA_ROOT:-/private} echo "开始初始化目录结构..." -echo "数据目录: ${DATA_ROOT}" +echo "数据根目录: ${DATA_ROOT}" echo "" # 创建 FTP 目录 echo "创建 FTP 目录..." -sudo mkdir -p ${DATA_ROOT}/ftp/share -sudo chown -R ${FTP_UID}:${FTP_GID} ${DATA_ROOT}/ftp -sudo chmod -R 755 ${DATA_ROOT}/ftp +sudo mkdir -p ${DATA_ROOT}/argus/metric/ftp/share +sudo chown -R ${FTP_UID}:${FTP_GID} ${DATA_ROOT}/argus/metric/ftp +sudo chmod -R 755 ${DATA_ROOT}/argus/metric/ftp # 创建 Prometheus 目录 echo "创建 Prometheus 目录..." -sudo mkdir -p ${DATA_ROOT}/prometheus/{data,rules,targets} - -# 创建默认的 targets 文件(先创建文件再改权限) -if [ ! -f "${DATA_ROOT}/prometheus/targets/node_exporter.json" ]; then - echo "创建默认 node_exporter targets..." - echo '[ - { - "targets": [], - "labels": { - "job": "node" - } - } -]' | sudo tee ${DATA_ROOT}/prometheus/targets/node_exporter.json > /dev/null -fi - -if [ ! -f "${DATA_ROOT}/prometheus/targets/dcgm_exporter.json" ]; then - echo "创建默认 dcgm_exporter targets..." - echo '[ - { - "targets": [], - "labels": { - "job": "dcgm" - } - } -]' | sudo tee ${DATA_ROOT}/prometheus/targets/dcgm_exporter.json > /dev/null -fi +sudo mkdir -p ${DATA_ROOT}/argus/metric/prometheus/{data,rules,targets} # 统一设置 Prometheus 目录权限 -sudo chown -R ${PROMETHEUS_UID}:${PROMETHEUS_GID} ${DATA_ROOT}/prometheus -sudo chmod -R 755 ${DATA_ROOT}/prometheus +sudo chown -R ${PROMETHEUS_UID}:${PROMETHEUS_GID} ${DATA_ROOT}/argus/metric/prometheus +sudo chmod -R 755 ${DATA_ROOT}/argus/metric/prometheus # 创建 Grafana 目录 echo "创建 Grafana 目录..." -sudo mkdir -p ${DATA_ROOT}/grafana/{data,logs,plugins,provisioning/datasources,provisioning/dashboards,data/sessions,data/dashboards,config} -sudo chown -R ${GRAFANA_UID}:${GRAFANA_GID} ${DATA_ROOT}/grafana -sudo chmod -R 755 ${DATA_ROOT}/grafana +sudo mkdir -p ${DATA_ROOT}/argus/metric/grafana/{data,logs,plugins,provisioning/datasources,provisioning/dashboards,data/sessions,data/dashboards,config} +sudo chown -R ${GRAFANA_UID}:${GRAFANA_GID} ${DATA_ROOT}/argus/metric/grafana +sudo chmod -R 755 ${DATA_ROOT}/argus/metric/grafana # 创建公共配置目录 -sudo mkdir -p ${DATA_ROOT}/etc -sudo chown -R ${FTP_UID}:${FTP_GID} ${DATA_ROOT}/etc -sudo chmod -R 755 ${DATA_ROOT}/etc +echo "创建公共配置目录..." +sudo mkdir -p ${DATA_ROOT}/argus/etc +sudo chown -R ${FTP_UID}:${FTP_GID} ${DATA_ROOT}/argus/etc +sudo chmod -R 755 ${DATA_ROOT}/argus/etc + +# 创建 Agent 目录 +echo "创建 Agent 目录..." +sudo mkdir -p ${DATA_ROOT}/argus/agent +sudo chown -R ${FTP_UID}:${FTP_GID} ${DATA_ROOT}/argus/agent +sudo chmod -R 755 ${DATA_ROOT}/argus/agent echo "目录初始化完成!" echo "" echo "目录结构:" echo " ${DATA_ROOT}/" -echo " ├── ftp/ (UID:${FTP_UID}, GID:${FTP_GID})" -echo " ├── prometheus/ (UID:${PROMETHEUS_UID}, GID:${PROMETHEUS_GID})" -echo " ├── grafana/ (UID:${GRAFANA_UID}, GID:${GRAFANA_GID})" -echo " └── etc/ (UID:${FTP_UID}, GID:${FTP_GID})" +echo " ├── argus/" +echo " │ ├── metric/" +echo " │ │ ├── ftp/ (UID:${FTP_UID}, GID:${FTP_GID})" +echo " │ │ ├── prometheus/ (UID:${PROMETHEUS_UID}, GID:${PROMETHEUS_GID})" +echo " │ │ └── grafana/ (UID:${GRAFANA_UID}, GID:${GRAFANA_GID})" +echo " │ ├── etc/ (UID:${FTP_UID}, GID:${FTP_GID})" +echo " │ └── agent/ (UID:${FTP_UID}, GID:${FTP_GID})" echo "" echo "您现在可以运行 'docker-compose up -d' 来启动所有服务" diff --git a/src/metric/tests/scripts/common/start-all.sh b/src/metric/tests/scripts/common/start-all.sh index fd51472..003efc2 100755 --- a/src/metric/tests/scripts/common/start-all.sh +++ b/src/metric/tests/scripts/common/start-all.sh @@ -9,6 +9,12 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" TEST_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" cd "$TEST_DIR" +# 解析参数 +FORCE_REBUILD=false +if [[ "$1" == "--rebuild" ]]; then + FORCE_REBUILD=true +fi + echo "==========================================" echo " Argus Metrics 一键启动脚本" echo "==========================================" @@ -22,19 +28,13 @@ if ! command -v docker &> /dev/null; then exit 1 fi -# 检测 docker-compose 命令(兼容新旧版本) -COMPOSE_FILE="$TEST_DIR/docker-compose.yml" -if command -v docker-compose &> /dev/null; then - DOCKER_COMPOSE="docker-compose -f $COMPOSE_FILE" - echo "使用: docker-compose" -elif docker compose version &> /dev/null 2>&1; then - DOCKER_COMPOSE="docker compose -f $COMPOSE_FILE" - echo "使用: docker compose" -else - echo "错误: 未找到 docker-compose 或 docker compose 命令" +# 检查 docker compose 命令 +if ! docker compose version &> /dev/null 2>&1; then + echo "错误: 未找到 docker compose 命令,请确保 Docker Compose V2 已安装" exit 1 fi -echo "Compose 文件: $COMPOSE_FILE" +echo "使用: docker compose" +echo "Compose 文件: $TEST_DIR/docker-compose.yml" echo "" # 检查必要的构建目录 @@ -86,7 +86,7 @@ echo "2. 准备 Docker 镜像..." # 检查镜像是否存在 IMAGE_CACHE_DIR="$TEST_DIR/images-cache" -IMAGES=("argus-metric-ftp:latest" "argus-metric-prometheus:latest" "argus-metric-grafana:latest") +IMAGES=("argus-metric-ftp:latest" "argus-metric-prometheus:latest" "argus-metric-grafana:latest" "ubuntu:22.04") all_images_exist=true for image in "${IMAGES[@]}"; do @@ -96,7 +96,12 @@ for image in "${IMAGES[@]}"; do fi done -if $all_images_exist; then +if $FORCE_REBUILD; then + echo "强制重新构建镜像(--rebuild 模式)..." + cd "$TEST_DIR" + docker compose build --no-cache + echo "镜像重新构建完成" +elif $all_images_exist; then echo "所有镜像已存在,跳过构建" else echo "检测到缺失镜像,尝试从缓存加载..." @@ -117,6 +122,9 @@ else "argus-metric-grafana:latest") cache_file="${IMAGE_CACHE_DIR}/argus-grafana.tar" ;; + "ubuntu:22.04") + cache_file="${IMAGE_CACHE_DIR}/test-node.tar" + ;; esac if [ -f "$cache_file" ]; then @@ -142,7 +150,7 @@ else echo "部分镜像缺失,开始构建..." echo "工作目录: $(pwd)" cd "$TEST_DIR" - $DOCKER_COMPOSE build + docker compose build # 询问是否保存镜像 echo "" @@ -162,6 +170,9 @@ else "argus-metric-grafana:latest") docker save -o "${IMAGE_CACHE_DIR}/argus-grafana.tar" "$image" && echo " 已保存: argus-grafana.tar" ;; + "ubuntu:22.04") + docker save -o "${IMAGE_CACHE_DIR}/test-node.tar" "$image" && echo " 已保存: test-node.tar" + ;; esac done echo "镜像已保存到: $IMAGE_CACHE_DIR/" @@ -174,8 +185,8 @@ fi echo "" echo "3. 启动服务..." -cd "$SCRIPT_DIR" -$DOCKER_COMPOSE up -d +cd "$TEST_DIR" +docker compose up -d echo "" echo "4. 等待服务启动..." @@ -183,8 +194,8 @@ sleep 5 echo "" echo "5. 检查服务状态..." -cd "$SCRIPT_DIR" -$DOCKER_COMPOSE ps +cd "$TEST_DIR" +docker compose ps echo "" echo "==========================================" @@ -203,10 +214,10 @@ echo " 用户名: admin" echo " 密码: admin" echo "" echo "常用命令:" -echo " 查看日志: $DOCKER_COMPOSE logs -f [service]" -echo " 停止服务: $DOCKER_COMPOSE stop" -echo " 重启服务: $DOCKER_COMPOSE restart" -echo " 停止并删除: $DOCKER_COMPOSE down" -echo " 停止并删除卷: $DOCKER_COMPOSE down -v" +echo " 查看日志: docker compose logs -f [service]" +echo " 停止服务: docker compose stop" +echo " 重启服务: docker compose restart" +echo " 停止并删除: docker compose down" +echo " 停止并删除卷: docker compose down -v" echo "" diff --git a/src/metric/tests/scripts/common/stop-all.sh b/src/metric/tests/scripts/common/stop-all.sh index 1ede6d6..233eb83 100755 --- a/src/metric/tests/scripts/common/stop-all.sh +++ b/src/metric/tests/scripts/common/stop-all.sh @@ -1,52 +1,50 @@ -#!/bin/bash + #!/bin/bash -# 停止所有服务脚本 + # 停止所有服务脚本 -set -e + set -e -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -TEST_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" -cd "$TEST_DIR" + SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + TEST_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" + cd "$TEST_DIR" -# 检测 docker-compose 命令(兼容新旧版本) -COMPOSE_FILE="$TEST_DIR/docker-compose.yml" -if command -v docker-compose &> /dev/null; then - DOCKER_COMPOSE="docker-compose -f $COMPOSE_FILE" -elif docker compose version &> /dev/null 2>&1; then - DOCKER_COMPOSE="docker compose -f $COMPOSE_FILE" -else - echo "错误: 未找到 docker-compose 或 docker compose 命令" - exit 1 -fi + # 检查 docker compose 命令 + if ! docker compose version &> /dev/null 2>&1; then + echo "错误: 未找到 docker compose 命令,请确保 Docker Compose V2 已安装" + exit 1 + fi -echo "==========================================" -echo " 停止 Argus Metrics 服务" -echo "==========================================" -echo "" - -# 检查是否有运行的容器 -if [ "$($DOCKER_COMPOSE ps -q)" ]; then - echo "停止所有服务..." - $DOCKER_COMPOSE stop - + echo "==========================================" + echo " 停止 Argus Metrics 服务" + echo "==========================================" echo "" - read -p "是否要删除容器? (y/N): " -n 1 -r - echo - if [[ $REPLY =~ ^[Yy]$ ]]; then - $DOCKER_COMPOSE down - echo "容器已删除" + echo "使用: docker compose" + echo "Compose 文件: $TEST_DIR/docker-compose.yml" + echo "" + + # 检查是否有运行的容器 + if [ "$(docker compose ps -q)" ]; then + echo "停止所有服务..." + docker compose stop - read -p "是否要删除数据卷? (y/N): " -n 1 -r + echo "" + read -p "是否要删除容器? (y/N): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then - $DOCKER_COMPOSE down -v - echo "数据卷已删除" + docker compose down + echo "容器已删除" + + read -p "是否要删除数据卷? (y/N): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + docker compose down -v + echo "数据卷已删除" + fi fi + else + echo "没有运行的服务" fi -else - echo "没有运行的服务" -fi -echo "" -echo "完成!" + echo "" + echo "完成!" diff --git a/src/metric/tests/scripts/load-images.sh b/src/metric/tests/scripts/load-images.sh new file mode 100755 index 0000000..8eba9ce --- /dev/null +++ b/src/metric/tests/scripts/load-images.sh @@ -0,0 +1,109 @@ +#!/bin/bash + +# 镜像加载脚本 +# 用于从 tar 文件加载 Docker 镜像 + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +TEST_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" +INPUT_DIR="${1:-$TEST_DIR/images-cache}" + +echo "==========================================" +echo " Docker 镜像加载脚本" +echo "==========================================" +echo "" +echo "输入目录: $INPUT_DIR" +echo "" + +# 检查输入目录是否存在 +if [ ! -d "$INPUT_DIR" ]; then + echo "错误: 目录不存在: $INPUT_DIR" + exit 1 +fi + +# 定义要加载的镜像文件和期望的镜像名称 +declare -A IMAGES=( + ["argus-ftp.tar"]="argus-metric-ftp:latest" + ["argus-prometheus.tar"]="argus-metric-prometheus:latest" + ["argus-grafana.tar"]="argus-metric-grafana:latest" + ["test-node.tar"]="ubuntu:22.04" +) + +# 加载镜像 +total=0 +success=0 +skipped=0 +failed=0 + +for tar_file in "${!IMAGES[@]}"; do + total=$((total + 1)) + input_file="${INPUT_DIR}/${tar_file}" + image_name="${IMAGES[$tar_file]}" + + echo "[$total] 处理: $tar_file" + + # 检查 tar 文件是否存在 + if [ ! -f "$input_file" ]; then + echo " ✗ 文件不存在: $tar_file" + failed=$((failed + 1)) + echo "" + continue + fi + + # 检查镜像是否已存在 + if docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "^${image_name}$"; then + echo " ⊙ 镜像已存在: $image_name (跳过)" + skipped=$((skipped + 1)) + echo "" + continue + fi + + # 加载镜像 + echo " → 加载镜像..." + if docker load -i "$input_file"; then + # 验证加载后的镜像 + if docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "^${image_name}$"; then + echo " ✓ 加载成功: $image_name" + success=$((success + 1)) + else + echo " ⚠ 加载完成,但镜像名称可能不匹配" + echo " 请检查: docker images | grep '${image_name%:*}'" + success=$((success + 1)) + fi + else + echo " ✗ 加载失败: $tar_file" + failed=$((failed + 1)) + fi + echo "" +done + +echo "==========================================" +echo " 加载完成" +echo "==========================================" +echo "" +echo "统计:" +echo " 总计: $total" +echo " 成功: $success" +echo " 跳过: $skipped" +echo " 失败: $failed" +echo "" + +# 显示当前的镜像 +echo "当前 Argus 相关镜像:" +docker images | grep -E "REPOSITORY|argus-metric" || echo "未找到 argus-metric 镜像" +echo "" + +if [ $failed -gt 0 ]; then + echo "部分镜像加载失败,请检查!" + exit 1 +fi + +if [ $success -gt 0 ]; then + echo "✓ 镜像加载成功!" + echo "" + echo "下一步:" + echo " 运行: bash scripts/common/start-all.sh" + echo " 或者: docker-compose up -d" +fi + diff --git a/src/metric/tests/scripts/save-images.sh b/src/metric/tests/scripts/save-images.sh new file mode 100755 index 0000000..4b62510 --- /dev/null +++ b/src/metric/tests/scripts/save-images.sh @@ -0,0 +1,93 @@ +#!/bin/bash + +# 镜像保存脚本 +# 用于保存 Docker 镜像到 tar 文件,便于离线部署 + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +TEST_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" +OUTPUT_DIR="${1:-$TEST_DIR/images-cache}" + +echo "==========================================" +echo " Docker 镜像保存脚本" +echo "==========================================" +echo "" +echo "输出目录: $OUTPUT_DIR" +echo "" + +# 创建输出目录 +mkdir -p "$OUTPUT_DIR" + +# 定义镜像名称(与 docker-compose.yml 保持一致) +declare -A IMAGES=( + ["argus-metric-ftp:latest"]="argus-ftp.tar" + ["argus-metric-prometheus:latest"]="argus-prometheus.tar" + ["argus-metric-grafana:latest"]="argus-grafana.tar" + ["ubuntu:22.04"]="test-node.tar" +) + +# 检查镜像是否存在并保存 +total=0 +success=0 +failed=0 + +for image in "${!IMAGES[@]}"; do + total=$((total + 1)) + output_file="${OUTPUT_DIR}/${IMAGES[$image]}" + + echo "[$total] 检查镜像: $image" + + if docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "^${image}$"; then + echo " ✓ 镜像存在,开始保存..." + if docker save -o "$output_file" "$image"; then + file_size=$(ls -lh "$output_file" | awk '{print $5}') + echo " ✓ 保存成功: ${IMAGES[$image]} ($file_size)" + success=$((success + 1)) + else + echo " ✗ 保存失败: $image" + failed=$((failed + 1)) + fi + else + echo " ✗ 镜像不存在,请先构建镜像" + failed=$((failed + 1)) + fi + echo "" +done + +echo "==========================================" +echo " 保存完成" +echo "==========================================" +echo "" +echo "统计:" +echo " 总计: $total" +echo " 成功: $success" +echo " 失败: $failed" +echo "" +echo "输出目录: $OUTPUT_DIR" +echo "" + +if [ $success -gt 0 ]; then + echo "已保存的文件:" + ls -lh "$OUTPUT_DIR"/*.tar 2>/dev/null || true + echo "" + echo "文件列表:" + for image in "${!IMAGES[@]}"; do + output_file="${OUTPUT_DIR}/${IMAGES[$image]}" + if [ -f "$output_file" ]; then + file_size=$(ls -lh "$output_file" | awk '{print $5}') + echo " - ${IMAGES[$image]} ($file_size)" + fi + done +fi + +echo "" +echo "使用说明:" +echo "1. 将 images-cache 目录复制到目标服务器的 ~/argus/src/metric/tests/ 下" +echo "2. 在目标服务器运行: bash scripts/common/start-all.sh" +echo "" + +if [ $failed -gt 0 ]; then + exit 1 +fi +