如何通过Rancher Compose传递环境变量,让Spring Boot加载指定Profile
问题分析与解决方案
咱们一步步拆解你遇到的问题,逐个调整后就能让环境变量正常生效了:
1. Dockerfile里的两处关键错误
- Jar文件名存在多余空格:你的ENTRYPOINT里写的是
docker- sample-example.jar,中间多了一个空格,这会导致Java无法找到正确的Jar包,先把这个空格去掉,改成docker-sample-example.jar。 - ENTRYPOINT的变量解析逻辑问题:你用了exec形式的ENTRYPOINT(数组格式),这种方式不会通过shell解析环境变量,所以
${environment}无法被替换成实际值。如果想保留exec形式,需要用sh -c包裹命令;或者直接改用shell形式的ENTRYPOINT。
修正后的Dockerfile可以二选一:
方案一:改用shell形式ENTRYPOINT
FROM openjdk:8 ENV environment default ADD target/docker-sample-example.jar docker-sample-example.jar EXPOSE 8087 ENTRYPOINT java -jar -Dspring.profiles.active=${environment} docker-sample-example.jar
方案二:保留exec形式但通过shell解析变量
FROM openjdk:8 ENV environment default ADD target/docker-sample-example.jar docker-sample-example.jar EXPOSE 8087 ENTRYPOINT ["sh", "-c", "java -jar -Dspring.profiles.active=${environment} docker-sample-example.jar"]
2. Docker-compose里的环境变量格式错误
你当前的environment配置里,- environment = dev存在多余空格,docker-compose不识别这种格式,必须去掉等号两边的空格,改成以下两种写法之一:
写法一:短格式(无空格)
version: "2" services: svc-get-interactions: image: myaccount.dkr.ecr.ap-southeast-2.amazonaws.com/app:latest environment: - environment=dev # 去掉等号两边的空格 ports: - 9898:8082/tcp labels: io.rancher.container.pull_image: always
写法二:键值对格式
version: "2" services: svc-get-interactions: image: myaccount.dkr.ecr.ap-southeast-2.amazonaws.com/app:latest environment: environment: dev # 标准键值对写法 ports: - 9898:8082/tcp labels: io.rancher.container.pull_image: always
3. 通过Bamboo传递环境变量到Rancher
如果要通过Bamboo的环境变量传递值,有两种常用方式:
- 命令行注入:在Bamboo的部署任务中,直接通过命令传递变量:
environment=prod rancher-compose up -d
Rancher Compose会自动把这个变量传递给容器,覆盖Dockerfile里的默认值。
- docker-compose引用Bamboo变量:在docker-compose中直接引用Bamboo已设置的环境变量:
version: "2" services: svc-get-interactions: image: myaccount.dkr.ecr.ap-southeast-2.amazonaws.com/app:latest environment: - environment=${BAMBOO_ENVIRONMENT_VAR} # 替换为你在Bamboo中定义的变量名 ports: - 9898:8082/tcp labels: io.rancher.container.pull_image: always
只要Bamboo中存在对应的变量,docker-compose会自动完成替换。
做完这些调整后,重新构建镜像(如果修改了Dockerfile),再执行rancher-compose up,容器启动时就会加载对应环境的Spring配置文件了。
内容的提问来源于stack exchange,提问作者bhaskar srinivas




