为 docker 外部化 spring 数据源属性
externalize spring datasource properties for docker
我希望能够覆盖
spring.datasource.url
spring.datasource.user
spring.datasource.password
在每个应用程序上开始使用环境变量;
那是因为我正在尝试 docker 化应用程序和数据库。
我想在 .env 文件中指定 url, user, password
(对于 docker-compose)
并与应用程序容器(连接到数据库)和数据库容器(能够连接)共享它们。
我试过了
export SPRING_DATASOURCE_URL=${url}
export SPRING_DATASOURCE_USER=${user}
export SPRING_DATASOURCE_PASSWORD=${password}
./mvnw spring-boot:run
但它似乎只获取最后一个参数(在本例中为密码)
我也试过了
./mvnw spring-boot:run \
-Dspring.datasource.url=${url} \
-Dspring.datasource.user=${user} \
-Dspring.datasource.password=${passwrod} \
但是这个似乎只关心第一个(url 在这种情况下)。
我真的很想知道是否有任何可行的方法可以实现
通过终端还是我实际上每次都必须覆盖属性文件?
更新
确实是我的问题。
是 spring.datasource.
username
,不是 user
。真的很抱歉浪费时间。
您的任何值是否可能包含 space 或其他 shell 破坏字符?报价是你的朋友
更基本的 java -jar target/project.jar -Dspring.datasource.url=...
有什么不同吗?
在 export SPRING_DATASOURCE_URL ...
变体上,你能正确地 echo $SPRING_DATASOURCE_URL
并取回预期值吗?对于所有环境变量?
如果您使用像 XXX
和 YYY
这样的简单值而不是实际值,会有什么不同吗?
正在尝试区分机制和数据...
${url}
、${user}
和 ${password}
(或 ${passwrod}
甚至)是文字(例如:env 变量本身)还是为了简洁而在此处省略?
您正在使用 maven 来执行 spring 引导应用程序,这至少是您的一些问题的原因。
当您在使用 Maven 时指定 -D 参数时,它会将系统参数传递给 Maven,而不是您的 spring 应用程序。如果您阅读 https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/run-system-properties.html 它表明您需要使用语法
mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dproperty1=overridden"
简单的答案是不要使用 maven 来执行您的 spring 启动应用程序。生成一个 jar 并使用 java -jar
执行它
刚刚有一个错字。是 spring.datasource.
username
,而不是 user
(或 SPRING_DATASOURCE_USERNAME
)。真的很抱歉浪费时间。
我希望能够覆盖
spring.datasource.url
spring.datasource.user
spring.datasource.password
在每个应用程序上开始使用环境变量;
那是因为我正在尝试 docker 化应用程序和数据库。
我想在 .env 文件中指定 url, user, password
(对于 docker-compose)
并与应用程序容器(连接到数据库)和数据库容器(能够连接)共享它们。
我试过了
export SPRING_DATASOURCE_URL=${url}
export SPRING_DATASOURCE_USER=${user}
export SPRING_DATASOURCE_PASSWORD=${password}
./mvnw spring-boot:run
但它似乎只获取最后一个参数(在本例中为密码)
我也试过了
./mvnw spring-boot:run \
-Dspring.datasource.url=${url} \
-Dspring.datasource.user=${user} \
-Dspring.datasource.password=${passwrod} \
但是这个似乎只关心第一个(url 在这种情况下)。
我真的很想知道是否有任何可行的方法可以实现 通过终端还是我实际上每次都必须覆盖属性文件?
更新
确实是我的问题。
是 spring.datasource.
username
,不是 user
。真的很抱歉浪费时间。
您的任何值是否可能包含 space 或其他 shell 破坏字符?报价是你的朋友
更基本的 java -jar target/project.jar -Dspring.datasource.url=...
有什么不同吗?
在 export SPRING_DATASOURCE_URL ...
变体上,你能正确地 echo $SPRING_DATASOURCE_URL
并取回预期值吗?对于所有环境变量?
如果您使用像 XXX
和 YYY
这样的简单值而不是实际值,会有什么不同吗?
正在尝试区分机制和数据...
${url}
、${user}
和 ${password}
(或 ${passwrod}
甚至)是文字(例如:env 变量本身)还是为了简洁而在此处省略?
您正在使用 maven 来执行 spring 引导应用程序,这至少是您的一些问题的原因。
当您在使用 Maven 时指定 -D 参数时,它会将系统参数传递给 Maven,而不是您的 spring 应用程序。如果您阅读 https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/run-system-properties.html 它表明您需要使用语法
mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dproperty1=overridden"
简单的答案是不要使用 maven 来执行您的 spring 启动应用程序。生成一个 jar 并使用 java -jar
执行它刚刚有一个错字。是 spring.datasource.
username
,而不是 user
(或 SPRING_DATASOURCE_USERNAME
)。真的很抱歉浪费时间。