Spring Boot镜像运行报错:/workspace/未找到Docker Compose文件
问题原因及解决办法
原因分析
- 使用
gradlew bootBuildImage构建镜像时,Paketo Buildpack默认仅打包Spring Boot应用的编译产物(如jar包、编译后的类文件等),不会将项目根目录的compose.yaml文件包含到镜像中。 - 容器启动后,Spring Boot Docker Compose自动配置会在容器工作目录
/workspace/下查找compose.yaml或docker-compose.yaml,但该目录中不存在目标文件,因此抛出No Docker Compose file found异常。
解决办法
方案1:通过Docker Compose统一管理应用与MySQL容器
在项目根目录的compose.yaml中添加Spring Boot应用的服务配置,让Docker Compose同时启动应用和MySQL:
services: mysql: # 保留原MySQL配置 image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: employee_db ports: - "3306:3306" employee-service: image: docker.io/library/employee-service:0.0.1-SNAPSHOT ports: - "8080:8080" environment: SPRING_PROFILES_ACTIVE: int depends_on: - mysql
执行以下命令启动所有服务:
docker compose up
方案2:启动容器时挂载本地compose.yaml文件
通过-v参数将本地项目根目录的compose.yaml挂载到容器的/workspace/目录:
# Linux/macOS docker run -p 8080:8080 -e "SPRING_PROFILES_ACTIVE=int" -v $(pwd)/compose.yaml:/workspace/compose.yaml docker.io/library/employee-service:0.0.1-SNAPSHOT # Windows PowerShell docker run -p 8080:8080 -e "SPRING_PROFILES_ACTIVE=int" -v ${PWD}/compose.yaml:/workspace/compose.yaml docker.io/library/employee-service:0.0.1-SNAPSHOT # Windows CMD docker run -p 8080:8080 -e "SPRING_PROFILES_ACTIVE=int" -v %cd%/compose.yaml:/workspace/compose.yaml docker.io/library/employee-service:0.0.1-SNAPSHOT
方案3:构建镜像时将compose.yaml打包到镜像中
修改Gradle构建配置,让bootBuildImage将compose.yaml包含到镜像内:
- Groovy DSL(
build.gradle):
bootBuildImage { buildpacks = ["gcr.io/paketo-buildpacks/java"] extraDirectories { paths = ["compose.yaml"] permissions = ["0644"] } }
- Kotlin DSL(
build.gradle.kts):
bootBuildImage { buildpacks.set(listOf("gcr.io/paketo-buildpacks/java")) extraDirectories { paths.set(listOf("compose.yaml")) permissions.set(mapOf("compose.yaml" to "0644")) } }
重新执行gradlew bootBuildImage构建镜像,之后启动容器即可正常读取配置。
方案4:通过环境变量指定Compose文件路径
设置SPRING_DOCKER_COMPOSE_FILE环境变量,指定容器内Compose文件的位置,同时挂载本地文件到对应路径:
docker run -p 8080:8080 -e "SPRING_PROFILES_ACTIVE=int" -e "SPRING_DOCKER_COMPOSE_FILE=/custom/path/compose.yaml" -v $(pwd)/compose.yaml:/custom/path/compose.yaml docker.io/library/employee-service:0.0.1-SNAPSHOT
内容的提问来源于stack exchange,提问作者purbarunc
相关产品推荐
相关产品推荐

