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

批处理文件构建完第一个Docker镜像后停止运行的问题求助

修复当前批处理脚本

你的脚本执行到第一个镜像构建就停止,核心原因是直接执行mvn命令会终止当前批处理进程——mvn本质是mvn.cmd批处理文件,直接调用会接管当前会话,导致后续命令无法执行。加上call命令可让Maven执行完后返回原批处理继续运行,同时还要修正路径匹配你的项目结构。

修改后的build.bat:

@echo off
echo Building Image Config-server

cd ./backend/service/configserver
call mvn compile com.google.cloud.tools:jib-maven-plugin:3.4.4:build -Dimage=niesuv/config-server
cd ../../../

echo --------------------------------------
echo Building Image Gateway-service
cd ./backend/service/gateway-service
call mvn compile com.google.cloud.tools:jib-maven-plugin:3.4.4:build -Dimage=niesuv/gateway-service
cd ../../../

echo --------------------------------------
echo Building Image Post-service
cd ./backend/service/post-service
call mvn compile com.google.cloud.tools:jib-maven-plugin:3.4.4:build -Dimage=niesuv/post-service
cd ../../../

echo --------------------------------------
echo Building Image S3-service
cd ./backend/service/s3-service
call mvn compile com.google.cloud.tools:jib-maven-plugin:3.4.4:build -Dimage=niesuv/s3-service
cd ../../../

echo --------------------------------------
echo Building Image User-service
cd ./backend/service/user-service
call mvn compile com.google.cloud.tools:jib-maven-plugin:3.4.4:build -Dimage=niesuv/user-service

关键修改说明

  1. 添加call前缀:所有mvn命令前加上call,确保执行完Maven命令后返回原批处理脚本继续执行。
  2. 修正路径:你的项目结构里是backend/service(不是services),且configserver为下划线命名(不是config-server),调整cd命令路径避免找不到目录导致脚本中断。

更优的自动化构建方案

方案1:Maven多模块统一构建

将所有Spring Boot服务作为Maven子模块,在父POM中统一配置Jib插件,一次命令即可构建所有镜像,比批处理更简洁易维护。

  1. 项目根目录创建父POM(pom.xml):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.yourgroup</groupId>
    <artifactId>project-root</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

    <modules>
        <module>backend/service/configserver</module>
        <module>backend/service/gateway-service</module>
        <module>backend/service/post-service</module>
        <module>backend/service/s3-service</module>
        <module>backend/service/user-service</module>
    </modules>

    <properties>
        <jib-maven-plugin.version>3.4.4</jib-maven-plugin.version>
        <docker.hub.prefix>niesuv</docker.hub.prefix>
    </properties>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>com.google.cloud.tools</groupId>
                    <artifactId>jib-maven-plugin</artifactId>
                    <version>${jib-maven-plugin.version}</version>
                    <configuration>
                        <from>
                            <image>openjdk:17-jre-slim</image>
                        </from>
                        <to>
                            <image>${docker.hub.prefix}/${project.artifactId}</image>
                        </to>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>
  1. 每个服务的子POM中启用Jib插件:
    无需重复配置版本和镜像前缀,添加以下内容即可:
<build>
    <plugins>
        <plugin>
            <groupId>com.google.cloud.tools</groupId>
            <artifactId>jib-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
  1. 执行统一构建命令:
    在项目根目录运行:
mvn compile jib:build

该命令会自动遍历所有子模块,构建并推送各自的Docker镜像到Docker Hub。

方案2:优化批处理脚本(减少重复代码)

如果不想修改Maven结构,可使用批处理循环功能简化脚本,避免重复的cd和mvn命令:

@echo off
setlocal enabledelayedexpansion

:: 定义服务列表:格式为"服务目录名 镜像名"
set "services=configserver niesuv/config-server gateway-service niesuv/gateway-service post-service niesuv/post-service s3-service niesuv/s3-service user-service niesuv/user-service"

set "count=0"
for %%a in (%services%) do (
    set /a count+=1
    if !count! equ 1 (
        set "dir=%%a"
    ) else (
        set "image=%%a"
        echo --------------------------------------
        echo Building Image !image!
        cd ./backend/service/!dir!
        call mvn compile com.google.cloud.tools:jib-maven-plugin:3.4.4:build -Dimage=!image!
        cd ../../../
        set count=0
    )
)

方案3:使用CI/CD工具(如GitHub Actions)

若需持续自动化构建,可配置GitHub Actions,每次代码提交自动构建并推送镜像:
示例.github/workflows/build-images.yml:

name: Build and Push Docker Images

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
          
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_TOKEN }}
          
      - name: Build all images with Maven
        run: mvn compile jib:build

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:35:12