无法使用 Spring 数据源参数运行 docker 容器

Posted

技术标签:

【中文标题】无法使用 Spring 数据源参数运行 docker 容器【英文标题】:Unable to run docker container with Spring data source arguments 【发布时间】:2022-01-12 05:20:42 【问题描述】:

我想运行一个带有一些数据源参数的 Docker 容器,就像我在终端上使用 Spring 数据源参数运行 Spring Boot 应用程序一样。例如:

java  -Dserver.port=8999 -Dlogging.org.hibernate.SQL=DEBUG -Dlogging.level.ROOT=DEBUG -Dlogging.level.io.github.jhipster=DEBUG -Dlogging.level.com.opti.ecom=DEBUG -Dlogging.path=/var/log/spring/ecom_v2/ -jar target/LatestBuild/ecom-0.0.1-SNAPSHOT.jar --spring.jpa.show_sql=true --spring.profiles.active=dev,no-liquibase --spring.datasource.url=jdbc:postgresql://aws_database_url --spring.datasource.username=user --spring.datasource.password=password --spring.datasource.hikari.maximum-pool-size=10

我已尝试使用 docker run --env 和上述单个参数,但它不起作用。

我不想在 application.properties 文件中传递这些参数。

Docker 文件:

FROM openjdk:11.0.7-jre-slim

ENV DEMO_ROOT=/root

ADD /target/LatestBuild/ecom-0.0.1-SNAPSHOT.jar $DEMO_ROOT
WORKDIR $DEMO_ROOT

CMD  ["java", "-jar", "ecom-0.0.1-SNAPSHOT.jar"]

很高兴在这方面得到一些帮助。 谢谢!

【问题讨论】:

【参考方案1】:

您可以specify Spring properties as environment variables,尤其是在容器设置中,这比尝试将它们作为命令行参数传递要容易得多。

您可以在单个 docker run 命令中编写

docker run \
  -e SERVER_PORT=8999 \
  -e LOGGING_ORG_HIBERNATE_SQL=DEBUG \
  ...
  -e SPRING_DATASOURCE_HIKARI_MAXIMUM_POOL_SIZE=10 \
  myimage

鉴于设置的数量,您可能会发现将它们放在一个专用文件中更方便,您可以将其传递给docker run --env-file 选项。

docker run \
  -d \
  -p 8999:8999 \
  --name myapp \
  --env-file spring.env \
  myimage

【讨论】:

【参考方案2】:

一个好的做法是使用包含这些配置属性(application.properties)的配置文件

您可以像这样使用 Docker 文件:

FROM openjdk:11
VOLUME /conf
ADD application.jar app.jar
RUN sh -c 'touch /app.jar'
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar app.jar --spring.config.location=file:/conf/" ]
EXPOSE 80
EXPOSE 81

在 /conf 卷中,你应该复制你的 application.properties

【讨论】:

以上是关于无法使用 Spring 数据源参数运行 docker 容器的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 Spring Tool Suite maven JVM 进程将 java 图标放在 Mac 的 Dock 上?

dock helloworld

主机无法访问 Wildfly 容器

是否可以在没有 Dock 图标的情况下将程序作为 AppleScript 程序的子进程运行?

如何从 Dock 中的程序快捷方式中检索命令行参数?

无法使用命令行参数启动 Spring Boot 应用程序