繁体   English   中英

Docker环境无法访问环境变量

[英]Cannot access environment variables in Docker environment

我正在尝试对我的 spring 启动项目进行 docker 化,并在 EC2 实例中使用它。

在 application.properties 我有以下几行,

spring.datasource.url=${SPRING_DATASOURCE_URL}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD}

我正在从我的环境中读取 SPRING_DATASOURCE_URL、SPRING_DATASOURCE_USERNAME 和 SPRING_DATASOURCE_PASSWORD。

我有以下Dockerfile,

FROM openjdk:latest
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar", "-DSPRING_DATASOURCE_URL=${DATASOURCE_URL}", \
                           "-DSPRING_DATASOURCE_USERNAME=${DATASOURCE_USERNAME}", \
                           "-DSPRING_DATASOURCE_PASSWORD=${DATASOURCE_PASSWORD}", "/app.jar"]

EXPOSE 8080

当我尝试运行以下命令时,

sudo docker run -p 80:8080 <image-repo> --env DATASOURCE_URL=<url> --env DATASOURCE_USERNAME=<username> --env DATASOURCE_PASSWORD=<password>

由于不存在的环境变量,我的应用程序崩溃了。

还,

我试过使用 docker-compose 提到的 Spring boot app started in docker cannot access environment variables链接。 调试对我来说变得更加复杂。

TL;DR 我想在我的 spring 启动应用程序中实现信息隐藏。 我想使用环境变量来隐藏我对数据库的凭据。 但是,我的 dockerized 程序没有我想要的环境变量。

如果您有除此之外的任何方法,我也很乐意听取我可以实现信息隐藏的方式。 谢谢。

您需要在图像名称之前放置诸如docker run --env之类的选项。 如果它们在图像名称之后,Docker 会将它们解释为要运行的命令; 使用此处的特定设置,您将看到它们作为 arguments 到您的main() function。

sudo docker run \
  --env SPRING_DATASOURCE_URL=... \
  image-name
  # additional arguments here visible to main() function

我在这里拼出了SPRING_DATASOURCE_URL Spring 已经知道如何将环境变量 map 添加到系统属性中。 这意味着您可以从application.properties文件和java -D选项中删除这些行,只要您在环境变量名称中拼出完整的 Spring 属性名称即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM