Spring Boot+Gradle本地K8s环境Tilt构建失败:环境变量解析错误
Spring Boot + Gradle 项目Tilt部署K8s时bootBuildImage解析环境变量失败
错误日志
STEP 1/3 — Building Custom Build: [supplier-service] Custom Build: Injecting Environment Variables EXPECTED_REF=supplier-service:tilt-build-1679856709 EXPECTED_IMAGE=library/supplier-service EXPECTED_TAG=tilt-build-1679856709 Running cmd: gradlew bootBuildImage --imageName $EXPECTED_REF > Task :compileJava UP-TO-DATE > Task :processResources UP-TO-DATE > Task :classes UP-TO-DATE > Task :resolveMainClassName UP-TO-DATE > Task :processAot UP-TO-DATE > Task :compileAotJava UP-TO-DATE > Task :processAotResources UP-TO-DATE > Task :aotClasses UP-TO-DATE > Task :collectReachabilityMetadata UP-TO-DATE > Task :bootJar UP-TO-DATE > Task :bootBuildImage FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':bootBuildImage'. > Unable to parse image reference "$EXPECTED_REF". Image reference must be in the form '[domainHost:port/][path/]name[:tag][@digest]', with 'path' and 'name' containing only [a-z0-9][.][_][-] * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 7s 9 actionable tasks: 1 executed, 8 up-to-date gradlew bootBuildImage --imageName $EXPECTED_REF exited with exit code 1 Build Failed: Custom build "gradlew bootBuildImage --imageName $EXPECTED_REF" failed: exit status 1
当前Tiltfile配置
# Build custom_build( # Name of the container image ref = 'supplier-service', # Command to build the container image command = 'gradlew bootBuildImage --imageName $EXPECTED_REF', # Files to watch that trigger a new build deps = ['build.gradle', 'src'], live_update = [ sync('src', '/workspace/BOOT-INF/classes') ] ) # Deploy k8s_yaml(kustomize('k8s')) # Manage k8s_resource('supplier-service', port_forwards=['9001'])
解决方案
问题根源
Tilt执行custom_build命令时会注入EXPECTED_REF等环境变量,但原配置使用单引号包裹命令,导致shell将$EXPECTED_REF视为字面量字符串,而非环境变量展开,最终bootBuildImage接收到无效的镜像引用字符串$EXPECTED_REF,触发格式错误。
修复方式
将custom_build中的command字段改用双引号包裹,让shell正确解析环境变量:
# Build custom_build( ref = 'supplier-service', # 改用双引号,确保shell展开$EXPECTED_REF环境变量 command = "gradlew bootBuildImage --imageName $EXPECTED_REF", deps = ['build.gradle', 'src'], live_update = [ sync('src', '/workspace/BOOT-INF/classes') ] ) # Deploy k8s_yaml(kustomize('k8s')) # Manage k8s_resource('supplier-service', port_forwards=['9001'])
替代方案
也可以直接使用Tilt的构建ID变量拼接镜像名,避免依赖shell环境变量解析:
import os # Build build_id = os.getenv("TILT_BUILD_ID") custom_build( ref = 'supplier-service', command = f'gradlew bootBuildImage --imageName supplier-service:tilt-build-{build_id}', deps = ['build.gradle', 'src'], live_update = [ sync('src', '/workspace/BOOT-INF/classes') ] ) # Deploy k8s_yaml(kustomize('k8s')) # Manage k8s_resource('supplier-service', port_forwards=['9001'])
内容的提问来源于stack exchange,提问作者Alois Vollmaier
相关产品推荐
相关产品推荐

