fix: 修复docker-compose中配置路径不正确的问题;

refs #20
This commit is contained in:
sundapeng.sdp 2025-10-14 12:16:05 +08:00
parent e1b19c04b0
commit 932038ab1d
7 changed files with 316 additions and 113 deletions

View File

@ -25,8 +25,8 @@ services:
- "${FTP_DATA_PORT:-20}:20" - "${FTP_DATA_PORT:-20}:20"
- "21100-21110:21100-21110" - "21100-21110:21100-21110"
volumes: volumes:
- ${DATA_ROOT:-./data}/ftp:/private/argus/ftp - ${DATA_ROOT:-/private}/argus/metric/ftp:/private/argus/ftp
- ${DATA_ROOT:-./data}/etc:/private/argus/etc - ${DATA_ROOT:-/private}/argus/etc:/private/argus/etc
networks: networks:
default: default:
ipv4_address: 172.30.0.40 ipv4_address: 172.30.0.40
@ -54,8 +54,8 @@ services:
ports: ports:
- "${PROMETHEUS_PORT:-9090}:9090" - "${PROMETHEUS_PORT:-9090}:9090"
volumes: volumes:
- ${DATA_ROOT:-./data}/prometheus:/private/argus/metric/prometheus - ${DATA_ROOT:-/private}/argus/metric/prometheus:/private/argus/metric/prometheus
- ${DATA_ROOT:-./data}/etc:/private/argus/etc - ${DATA_ROOT:-/private}/argus/etc:/private/argus/etc
networks: networks:
default: default:
ipv4_address: 172.30.0.41 ipv4_address: 172.30.0.41
@ -85,8 +85,8 @@ services:
ports: ports:
- "${GRAFANA_PORT:-3000}:3000" - "${GRAFANA_PORT:-3000}:3000"
volumes: volumes:
- ${DATA_ROOT:-./data}/grafana:/private/argus/metric/grafana - ${DATA_ROOT:-/private}/argus/metric/grafana:/private/argus/metric/grafana
- ${DATA_ROOT:-./data}/etc:/private/argus/etc - ${DATA_ROOT:-/private}/argus/etc:/private/argus/etc
networks: networks:
default: default:
ipv4_address: 172.30.0.42 ipv4_address: 172.30.0.42
@ -112,7 +112,7 @@ services:
- FTP_PASSWORD=${FTP_PASSWORD:-ZGClab1234!} - FTP_PASSWORD=${FTP_PASSWORD:-ZGClab1234!}
- FTP_PORT=${FTP_PORT:-21} - FTP_PORT=${FTP_PORT:-21}
volumes: volumes:
- ${DATA_ROOT:-./data}/agent:/private/argus/agent - ${DATA_ROOT:-/private}/argus/agent:/private/argus/agent
command: sleep infinity command: sleep infinity
networks: networks:
default: default:

View File

@ -3,8 +3,15 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
# 解析参数
REBUILD_FLAG=""
if [[ "$1" == "--rebuild" || "$1" == "-r" ]]; then
REBUILD_FLAG="--rebuild"
echo "[01] 启用强制重新构建模式"
fi
echo "[01] 启动所有服务..." echo "[01] 启动所有服务..."
bash "$SCRIPT_DIR/common/start-all.sh" bash "$SCRIPT_DIR/common/start-all.sh" $REBUILD_FLAG
echo "[01] 等待服务就绪..." echo "[01] 等待服务就绪..."
sleep 5 sleep 5

View File

@ -22,70 +22,55 @@ PROMETHEUS_UID=${PROMETHEUS_UID:-2133}
PROMETHEUS_GID=${PROMETHEUS_GID:-2015} PROMETHEUS_GID=${PROMETHEUS_GID:-2015}
GRAFANA_UID=${GRAFANA_UID:-2133} GRAFANA_UID=${GRAFANA_UID:-2133}
GRAFANA_GID=${GRAFANA_GID:-2015} GRAFANA_GID=${GRAFANA_GID:-2015}
DATA_ROOT=${DATA_ROOT:-$TEST_DIR/data} DATA_ROOT=${DATA_ROOT:-/private}
echo "开始初始化目录结构..." echo "开始初始化目录结构..."
echo "数据目录: ${DATA_ROOT}" echo "数据目录: ${DATA_ROOT}"
echo "" echo ""
# 创建 FTP 目录 # 创建 FTP 目录
echo "创建 FTP 目录..." echo "创建 FTP 目录..."
sudo mkdir -p ${DATA_ROOT}/ftp/share sudo mkdir -p ${DATA_ROOT}/argus/metric/ftp/share
sudo chown -R ${FTP_UID}:${FTP_GID} ${DATA_ROOT}/ftp sudo chown -R ${FTP_UID}:${FTP_GID} ${DATA_ROOT}/argus/metric/ftp
sudo chmod -R 755 ${DATA_ROOT}/ftp sudo chmod -R 755 ${DATA_ROOT}/argus/metric/ftp
# 创建 Prometheus 目录 # 创建 Prometheus 目录
echo "创建 Prometheus 目录..." echo "创建 Prometheus 目录..."
sudo mkdir -p ${DATA_ROOT}/prometheus/{data,rules,targets} sudo mkdir -p ${DATA_ROOT}/argus/metric/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
# 统一设置 Prometheus 目录权限 # 统一设置 Prometheus 目录权限
sudo chown -R ${PROMETHEUS_UID}:${PROMETHEUS_GID} ${DATA_ROOT}/prometheus sudo chown -R ${PROMETHEUS_UID}:${PROMETHEUS_GID} ${DATA_ROOT}/argus/metric/prometheus
sudo chmod -R 755 ${DATA_ROOT}/prometheus sudo chmod -R 755 ${DATA_ROOT}/argus/metric/prometheus
# 创建 Grafana 目录 # 创建 Grafana 目录
echo "创建 Grafana 目录..." echo "创建 Grafana 目录..."
sudo mkdir -p ${DATA_ROOT}/grafana/{data,logs,plugins,provisioning/datasources,provisioning/dashboards,data/sessions,data/dashboards,config} 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}/grafana sudo chown -R ${GRAFANA_UID}:${GRAFANA_GID} ${DATA_ROOT}/argus/metric/grafana
sudo chmod -R 755 ${DATA_ROOT}/grafana sudo chmod -R 755 ${DATA_ROOT}/argus/metric/grafana
# 创建公共配置目录 # 创建公共配置目录
sudo mkdir -p ${DATA_ROOT}/etc echo "创建公共配置目录..."
sudo chown -R ${FTP_UID}:${FTP_GID} ${DATA_ROOT}/etc sudo mkdir -p ${DATA_ROOT}/argus/etc
sudo chmod -R 755 ${DATA_ROOT}/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 ""
echo "目录结构:" echo "目录结构:"
echo " ${DATA_ROOT}/" echo " ${DATA_ROOT}/"
echo " ├── ftp/ (UID:${FTP_UID}, GID:${FTP_GID})" echo " ├── argus/"
echo " ├── prometheus/ (UID:${PROMETHEUS_UID}, GID:${PROMETHEUS_GID})" echo " │ ├── metric/"
echo " ├── grafana/ (UID:${GRAFANA_UID}, GID:${GRAFANA_GID})" echo " │ │ ├── ftp/ (UID:${FTP_UID}, GID:${FTP_GID})"
echo " └── etc/ (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 ""
echo "您现在可以运行 'docker-compose up -d' 来启动所有服务" echo "您现在可以运行 'docker-compose up -d' 来启动所有服务"

View File

@ -9,6 +9,12 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TEST_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" TEST_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$TEST_DIR" cd "$TEST_DIR"
# 解析参数
FORCE_REBUILD=false
if [[ "$1" == "--rebuild" ]]; then
FORCE_REBUILD=true
fi
echo "==========================================" echo "=========================================="
echo " Argus Metrics 一键启动脚本" echo " Argus Metrics 一键启动脚本"
echo "==========================================" echo "=========================================="
@ -22,19 +28,13 @@ if ! command -v docker &> /dev/null; then
exit 1 exit 1
fi fi
# 检测 docker-compose 命令(兼容新旧版本) # 检查 docker compose 命令
COMPOSE_FILE="$TEST_DIR/docker-compose.yml" if ! docker compose version &> /dev/null 2>&1; then
if command -v docker-compose &> /dev/null; then echo "错误: 未找到 docker compose 命令,请确保 Docker Compose V2 已安装"
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 命令"
exit 1 exit 1
fi fi
echo "Compose 文件: $COMPOSE_FILE" echo "使用: docker compose"
echo "Compose 文件: $TEST_DIR/docker-compose.yml"
echo "" echo ""
# 检查必要的构建目录 # 检查必要的构建目录
@ -86,7 +86,7 @@ echo "2. 准备 Docker 镜像..."
# 检查镜像是否存在 # 检查镜像是否存在
IMAGE_CACHE_DIR="$TEST_DIR/images-cache" 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 all_images_exist=true
for image in "${IMAGES[@]}"; do for image in "${IMAGES[@]}"; do
@ -96,7 +96,12 @@ for image in "${IMAGES[@]}"; do
fi fi
done 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 "所有镜像已存在,跳过构建" echo "所有镜像已存在,跳过构建"
else else
echo "检测到缺失镜像,尝试从缓存加载..." echo "检测到缺失镜像,尝试从缓存加载..."
@ -117,6 +122,9 @@ else
"argus-metric-grafana:latest") "argus-metric-grafana:latest")
cache_file="${IMAGE_CACHE_DIR}/argus-grafana.tar" cache_file="${IMAGE_CACHE_DIR}/argus-grafana.tar"
;; ;;
"ubuntu:22.04")
cache_file="${IMAGE_CACHE_DIR}/test-node.tar"
;;
esac esac
if [ -f "$cache_file" ]; then if [ -f "$cache_file" ]; then
@ -142,7 +150,7 @@ else
echo "部分镜像缺失,开始构建..." echo "部分镜像缺失,开始构建..."
echo "工作目录: $(pwd)" echo "工作目录: $(pwd)"
cd "$TEST_DIR" cd "$TEST_DIR"
$DOCKER_COMPOSE build docker compose build
# 询问是否保存镜像 # 询问是否保存镜像
echo "" echo ""
@ -162,6 +170,9 @@ else
"argus-metric-grafana:latest") "argus-metric-grafana:latest")
docker save -o "${IMAGE_CACHE_DIR}/argus-grafana.tar" "$image" && echo " 已保存: argus-grafana.tar" 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 esac
done done
echo "镜像已保存到: $IMAGE_CACHE_DIR/" echo "镜像已保存到: $IMAGE_CACHE_DIR/"
@ -174,8 +185,8 @@ fi
echo "" echo ""
echo "3. 启动服务..." echo "3. 启动服务..."
cd "$SCRIPT_DIR" cd "$TEST_DIR"
$DOCKER_COMPOSE up -d docker compose up -d
echo "" echo ""
echo "4. 等待服务启动..." echo "4. 等待服务启动..."
@ -183,8 +194,8 @@ sleep 5
echo "" echo ""
echo "5. 检查服务状态..." echo "5. 检查服务状态..."
cd "$SCRIPT_DIR" cd "$TEST_DIR"
$DOCKER_COMPOSE ps docker compose ps
echo "" echo ""
echo "==========================================" echo "=========================================="
@ -203,10 +214,10 @@ echo " 用户名: admin"
echo " 密码: admin" echo " 密码: admin"
echo "" echo ""
echo "常用命令:" echo "常用命令:"
echo " 查看日志: $DOCKER_COMPOSE logs -f [service]" echo " 查看日志: docker compose logs -f [service]"
echo " 停止服务: $DOCKER_COMPOSE stop" echo " 停止服务: docker compose stop"
echo " 重启服务: $DOCKER_COMPOSE restart" echo " 重启服务: docker compose restart"
echo " 停止并删除: $DOCKER_COMPOSE down" echo " 停止并删除: docker compose down"
echo " 停止并删除卷: $DOCKER_COMPOSE down -v" echo " 停止并删除卷: docker compose down -v"
echo "" echo ""

View File

@ -1,52 +1,50 @@
#!/bin/bash #!/bin/bash
# 停止所有服务脚本 # 停止所有服务脚本
set -e set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TEST_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" TEST_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$TEST_DIR" cd "$TEST_DIR"
# 检测 docker-compose 命令(兼容新旧版本) # 检查 docker compose 命令
COMPOSE_FILE="$TEST_DIR/docker-compose.yml" if ! docker compose version &> /dev/null 2>&1; then
if command -v docker-compose &> /dev/null; then echo "错误: 未找到 docker compose 命令,请确保 Docker Compose V2 已安装"
DOCKER_COMPOSE="docker-compose -f $COMPOSE_FILE" exit 1
elif docker compose version &> /dev/null 2>&1; then fi
DOCKER_COMPOSE="docker compose -f $COMPOSE_FILE"
else
echo "错误: 未找到 docker-compose 或 docker compose 命令"
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 ""
echo "使用: docker compose"
echo "Compose 文件: $TEST_DIR/docker-compose.yml"
echo "" echo ""
read -p "是否要删除容器? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
$DOCKER_COMPOSE down
echo "容器已删除"
read -p "是否要删除数据卷? (y/N): " -n 1 -r # 检查是否有运行的容器
if [ "$(docker compose ps -q)" ]; then
echo "停止所有服务..."
docker compose stop
echo ""
read -p "是否要删除容器? (y/N): " -n 1 -r
echo echo
if [[ $REPLY =~ ^[Yy]$ ]]; then if [[ $REPLY =~ ^[Yy]$ ]]; then
$DOCKER_COMPOSE down -v docker compose down
echo "数据卷已删除" echo "容器已删除"
read -p "是否要删除数据卷? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
docker compose down -v
echo "数据卷已删除"
fi
fi fi
else
echo "没有运行的服务"
fi fi
else
echo "没有运行的服务"
fi
echo "" echo ""
echo "完成!" echo "完成!"

View File

@ -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

View File

@ -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