You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GitHub Action启动Docker镜像后执行Spring Shell的init-users命令

解决GitHub Action中执行Spring Shell命令的方案

核心思路

在GitHub Action的非交互式环境中,需先后台启动容器,等应用初始化完成后,通过docker exec执行目标命令,同时保证容器持续运行提供服务。

具体实现步骤

  1. 停止旧容器(优化版)
    替换原有复杂的容器查找逻辑,用Docker原生过滤参数更可靠,避免无容器时触发报错:

    docker stop $(docker ps -qf "ancestor=repo/my-api") || true
    
  2. 后台启动新容器
    使用-d参数让容器在后台运行,同时指定容器名方便后续操作:

    docker run -d -p 8002:8080 --name my-api repo/my-api:1.2.3
    
  3. 等待应用启动完成
    Spring Boot应用需要时间初始化,优先通过健康检查端点等待(若配置了Actuator),无健康端点则用固定时长睡眠:

    # 方式1:通过Actuator健康检查等待(推荐)
    until curl -s http://localhost:8002/actuator/health | grep -q "UP"; do
        sleep 5
    done
    
    # 方式2:固定时长睡眠(根据应用启动时间调整)
    # sleep 30
    
  4. 执行init-users命令
    通过docker exec进入容器,调用Spring Shell执行目标命令,根据应用启动方式选以下两种写法:

    • 若应用支持直接传递命令参数:
      docker exec my-api java -jar your-app.jar init-users
      
    • 若需模拟交互式输入(非交互环境用管道传递命令):
      echo "init-users" | docker exec -i my-api /bin/sh -c "java -jar your-app.jar"
      

    注意:替换your-app.jar为容器内实际的应用jar包名称。

完整GitHub Action脚本示例

script: |
    # 停止旧容器
    docker stop $(docker ps -qf "ancestor=repo/my-api") || true
    # 后台启动新容器
    docker run -d -p 8002:8080 --name my-api repo/my-api:1.2.3
    # 等待应用启动
    until curl -s http://localhost:8002/actuator/health | grep -q "UP"; do
        sleep 5
    done
    # 执行init-users命令
    docker exec my-api java -jar your-app.jar init-users

关键注意事项

  • 移除原命令中的-it参数:GitHub Action是无终端的非交互式环境,-it会导致容器无法后台运行甚至启动失败。
  • 必须等待应用初始化完成:Spring Shell组件需和应用一起启动,直接执行命令会因环境未就绪失败。
  • 容器名要唯一:用--name指定容器名,避免后续docker exec操作出错。

内容的提问来源于stack exchange,提问作者Bademeister

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 11:48:14