I have a Docker image of a Spring Boot app running in Kubernetes cluster. I'm trying to override an entrypoint.
My original entrypoint was
ENTRYPOINT ["java", "-jar", "/app/myapp-exec.jar"]So I tried to override it in spec of deployment because I need to pass some JVM arguments:
command: ["sh", "-c", "java ${JAVA_OPTS} -jar /app/myapp-exec.jar ${0} ${@}"]
args:
- --spring[0].property=property_value
env:
- name: "JAVA_OPTS"
value: "...jvm options..."
- name: spring.property1
value: property_value
- name: spring.property2
value: property_valueMy application is launched, but properties defined under env that used to get passed to Spring app with original entry point are not passed anymore. According to Spring Docker documentation, ${0} ${@} should fix my exact issue, but it doesn't seem to work.
Any help is appreciated.
You can get around the various shell-quoting problems by making the main container process a very short shell script:
#!/bin/sh
exec java $JAVA_OPTS -jar /myapp-exec.jar "$@"Then your Dockerfile can specify this script as the main container command, instead of trying to shoehorn it into the ENTRYPOINT/CMD split somehow.
COPY run-myapp.sh .
CMD ["./run-myapp.sh"] # (I tend to prefer CMD to ENTRYPOINT)If the only things you're trying to pass as command-line arguments are Spring properties, you can specify those as environment variables; this is much easier than trying to figure out the command-line setup. So for your use case, I would specify
containers:
- name: myapp
image: registry.example.com/myapp:20211203
# neither command: nor args:
env:
- name: "JAVA_OPTS"
value: "...jvm options..."
- name: SPRING_PROPERTY1
value: property_value
- name: SPRING_PROPERTY2
value: property_value
- name: SPRING_0_PROPERTY
value: property_value