GitHub Actions中Docker Compose无法为Spring Boot镜像设置环境变量
原因分析与解决办法
日志里${SPRING_PROFILE_ACTIVES}被当作字符串输出,说明容器未正确读取到.env.stage中的环境变量,或者变量解析异常,以下是几个常见原因及解决办法:
1. echo命令额外添加换行符导致解码异常
GitHub Action默认使用Ubuntu runner,echo命令会自动在输出末尾添加换行符,若你的base64字符串不包含末尾换行,这会导致解码后的.env.stage多一行空行,干扰Docker Compose的变量解析。
解决办法:用printf代替echo,避免额外换行:
printf "%s" "${{ secrets.ENV_STAGE }}" | base64 -d > .env.stage
2. .env.stage文件存在Windows换行符(CRLF)
若你在Windows本地生成base64字符串,解码后的文件会带有CRLF换行符,Linux环境下的Docker Compose会把\r当作变量值的一部分,导致解析错误。
解决办法:在Action中添加换行符转换步骤:
- name: "Fix line endings" run: | sudo apt-get update && sudo apt-get install -y dos2unix dos2unix .env.stage
3. Docker Compose的--env-file参数使用混淆
你在docker-compose up命令中添加的--env-file .env.stage,是用来替换Docker Compose配置文件中的${VAR}占位符,而非传递给容器的环境变量。而你的Compose配置中已经通过env_file: .env.stage给容器注入变量,重复使用可能导致优先级冲突。
解决办法:去掉docker-compose up命令中的--env-file参数:
docker-compose -f docker-compose.stage.yml up --build -d
4. 验证容器实际环境变量
在Action中添加步骤,直接查看容器内的环境变量,确认变量是否正确注入:
- name: "Check container environment variables" run: docker exec myapp-api-1 env | grep SPRING_PROFILE_ACTIVES
5. 检查Docker Compose版本差异
GitHub Action中的Docker Compose版本可能与本地不一致,部分旧版本对env_file的处理存在bug。可以在Action中指定使用最新版本:
- name: "Install latest Docker Compose" run: | sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
内容的提问来源于stack exchange,提问作者Sapumal W

