使用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目录执行构建时,无法访问上级目录的文件。修复方式如下:
统一构建上下文到根目录
修改根目录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。关联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
相关产品推荐
相关产品推荐

