我正在尝试为 Spring Boot 3 中的服务设置 Postgres,但我无法让环境变量正常工作。
对数据库属性进行硬编码可以正常工作,如下所示。
spring:
datasource:
url: jdbc:postgresql://localhost:5432/abc-shop
username: postgres
password: postgres
但是使用以下命令会出现错误。
spring:
datasource:
url: jdbc:postgresql://${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
username: ${POSTGRES_USER}
password: ${POSTGRES_PASSWORD}
java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, jdbc:postgresql://${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
我在项目根目录的 .env 文件中有环境变量,我也传递它们 来自 docker-compose 文件。
这是 .env 文件 -
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=abc-shop
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
这是 docker-compose -
version: '3.8'
services:
postgres:
image: postgres:latest
container_name: postgress_db
restart: always
environment:
POSTGRES_HOST: ${POSTGRES_HOST}
POSTGRES_PORT: ${POSTGRES_PORT}
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
我检查了本地计算机中的 postgres 容器内部,并且环境变量存在于其中。 Spring 似乎无法读取它们。此外,在之前的项目中,我让它在生产环境中像这样工作,我在 GitHub Actions 秘密中拥有环境变量。
此外,很明显,在开发环境中对值进行硬编码并不重要,我也知道这一点,我只是想知道为什么这不起作用。
如果您需要更多信息,请告诉我,谢谢!
您的定义和用法之间似乎存在一些差异。您发布的
compose.yaml
使用正确的(!)变量启动 PostgreSQL 容器。您自己也说过,在 Spring 应用程序中“对值进行硬编码”是可行的。
但是,您还没有说明您的应用程序是如何启动的。如果这行得通,您需要将相同的变量传递给执行它的 JVM。简而言之,您已经表明您已使主机/数据库/凭据的“接收者”接受这些内容。不要忘记让“发送者”(即充当 PostgreSQL 服务器客户端的 Spring 应用程序)“知道”相同的信息!事实上,异常显示
${...}
部分未插值,这似乎表明执行 Java 代码的进程缺少环境变量。