通过docker compose将JAVA_选项传递给spring启动应用程序

通过docker compose将JAVA_选项传递给spring启动应用程序,java,spring-boot,docker-compose,jvm,spring-boot-docker-plugin,Java,Spring Boot,Docker Compose,Jvm,Spring Boot Docker Plugin,我正在使用下面的配置创建docker映像。一旦映像准备好,我想将JAVA_选项传递给docker容器,这样它就可以传递给我的spring boot应用程序。每当我尝试打开容器时,我都会收到“runtime create failed:container\u linux.go:348:starting container process Result”exec:\“java$java\u OPTS\”:在$PATH中找不到可执行文件:未知”错误。我错过什么了吗?非常感谢您的帮助 Dockerfil

我正在使用下面的配置创建docker映像。一旦映像准备好,我想将JAVA_选项传递给docker容器,这样它就可以传递给我的spring boot应用程序。每当我尝试打开容器时,我都会收到“runtime create failed:container\u linux.go:348:starting container process Result”exec:\“java$java\u OPTS\”:在$PATH中找不到可执行文件:未知”错误。我错过什么了吗?非常感谢您的帮助

Dockerfile

FROM openjdk:8-jdk-alpine

LABEL maintainer="myname@test.com"

# Add a volume pointing to /tmp
VOLUME /tmp

# Make port 8080 available to the world outside this container
EXPOSE 8080

# The application's jar file
ARG JAR_FILE=target/my.jar

# Add the application's jar to the container
ADD ${JAR_FILE} my.jar

ENV JAVA_OPTS=""
# Run the jar file 
ENTRYPOINT ["java $JAVA_OPTS","-Djava.security.egd=file:/dev/./urandom","-jar","/my.jar"]
docker compose

version: '2.1'
services:
  service1:
    hostname: test
    domainname: mydomain.com
    image: myimage:latest
    container_name: test-container
    environment:
      - JAVA_OPTS=-Dapp.clients.scheme=http -Dapp.clients.port=9096 -Dserver.port=8082
    ports:
      - "8082:8082"         

在更仔细地研究错误之后,我找到了解决方案。如果将来有人需要,请在此处发布

ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /my.jar"]

您不应该将
java$java\u OPTS
ENTRYPOINT[“sh”、“-c”、“java$java\u OPTS”]一起使用

它的主要问题是,使用这种方法,您的应用程序将不会收到sigterm,因此在正常关闭的情况下,它将不适用于您(如果您不知道这一点,您将发现有关该问题的更多信息)

如果您想在docker环境中自定义java选项,请使用
java\u工具\u选项
environment属性()和
ENTRYPOINT[“java”,…]

使用此属性,您甚至可以在Dockerfile中声明预期选项,如:

ENV JAVA_TOOL_OPTIONS "-XX:MaxRAMPercentage=80"
您可以稍后使用外部提供的docker或kubernetes属性轻松覆盖它


JAVA\u工具\u选项
jib
项目使用-

正如上面的答案所提到的,如果您希望能够优雅地关闭JAVA应用程序,请不要这样做