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

使用gradle-docker-compose-plugin执行集成测试时遇镜像及COPY错误

解决方案建议

一、修复镜像标签格式错误问题

原错误invalid tag "162ee0778db45c04b4ff6e6c2a46c5c8_functional-tests_-web": invalid reference format,是因为插件默认生成的镜像标签包含特殊字符/过长,违反Docker镜像命名规则。无需复制docker-compose.yml到子模块,直接在functional-tests/build.gradle.kts中调整配置:

dockerCompose {
    useComposeFiles.add("../docker-compose.yml")
    // 指定compose命令工作目录为项目根目录,保证yaml中相对路径正常解析
    workingDirectory = project.rootDir
    // 自定义镜像标签,规避自动生成的非法格式
    composeBuild {
        imageTag = "my-app-web:test"
    }
    isRequiredBy(project.tasks.test)
}

二、解决COPY路径错误问题

lstat /var/lib/docker/tmp/buildkit-mount535000430/application/build/libs: no such file or directory错误源于Docker构建上下文限制:在functional-tests目录执行构建时,无法访问上级目录的文件。修复方式如下:

  1. 统一构建上下文到根目录
    修改根目录docker-compose.yml的build配置,指定上下文为根目录、Dockerfile路径:

    services:
      web:
        build:
          context: .  # 构建上下文设为项目根目录
          dockerfile: application/Dockerfile  # 指向application目录下的Dockerfile
        image: my-app-web:test
        # 其他服务配置...
    

    配合之前配置的workingDirectory = project.rootDir,插件执行构建时就能正确访问application/build/libs。

  2. 关联Gradle任务依赖
    在functional-tests/build.gradle.kts中添加任务依赖,确保构建镜像前先生成jar包:

    tasks.named("composeBuild") {
        dependsOn(":application:bootJar")
    }
    

三、兼顾本地与CI两种测试场景

通过Gradle属性控制插件行为,实现“自动检测应用状态,未启动则启动”的需求:

// 定义开关属性,默认开启(CI场景),本地可通过命令行关闭
val autoStartApp = project.findProperty("autoStartApp")?.toString()?.toBoolean() ?: true

dockerCompose {
    useComposeFiles.add("../docker-compose.yml")
    workingDirectory = project.rootDir
    composeBuild {
        imageTag = "my-app-web:test"
    }
    if (autoStartApp) {
        isRequiredBy(project.tasks.test)
        // 可选:配置等待应用就绪的健康检查
        waitForHealthy(true)
    }
}
  • CI场景:直接执行./gradlew :functional-tests:test,插件自动启动应用后执行测试。
  • 本地场景:手动启动应用后,执行./gradlew :functional-tests:test -PautoStartApp=false,跳过自动启动逻辑。

额外注意事项

  • 确认gradle-docker-compose-plugin版本(0.16.12)与Gradle 7.5.1兼容,当前版本适配正常。
  • 本地手动启动应用时,需保证docker-compose.yml中的端口与手动启动的应用端口无冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:55:30