I have problem with my spring boot app.
If I docker-compose up, I see this error -> Error: Invalid or corrupt jarfile /bin/sh
MongoDb, prometheus and grafana start correctly.
Dockerfile
FROM openjdk:11-jre-slim as build
ADD target/rest-test-0.0.1-SNAPSHOT.jar .
EXPOSE 8000
CMD java -jar rest-test-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-Dspring.profiles.active=prod","-jar"]
docker-compose.yml
version: "3.8"
services:
rest-test:
build: .
restart: always
ports:
- "8000:8080"
depends_on:
- mongo_db
environment:
- "SPRING_PROFILES_ACTIVE=prod"
mongo_db:
image: "mongo:latest"
restart: always
ports:
- "27018:27017"
prometheus:
image: "prom/prometheus"
restart: always
depends_on:
- rest-test
ports:
- "9090:9090"
grafana:
image: "grafana/grafana"
restart: always
depends_on:
- rest-test
ports:
- "3000:3000"
CodePudding user response:
That ENTRYPOINT
line doesn't fit here, and you should remove it. If you do need JVM options, include them in the java
command.
CMD java -Dspring.profiles.active=prod -jar rest-test-0.0.1-SNAPSHOT.jar
# no ENTRYPOINT
You're seeing two things happen in your original Dockerfile. Since CMD
is a bare string, Docker automatically wraps it in /bin/sh -c
; and since you have both ENTRYPOINT
and CMD
, the CMD
gets passed as arguments to the ENTRYPOINT
. This results in the nonsensical command
java -D... -jar /bin/sh -c 'java -jar rest-test-0.0.1-SNAPSHOT.jar'
which produces the error you see.
There is no requirement that an image have an ENTRYPOINT
; in many cases specifying only CMD
is easier to manage (for example, you can docker run --rm -it your-image sh
to get an interactive debugging shell on a built image). If you do split CMD
and ENTRYPOINT
, either the ENTRYPOINT
should be written so it accepts a complete command as arguments or the ENTRYPOINT
should itself be a complete command and the CMD
its arguments.
# "Container as command" pattern: lets you
# docker run ... the-image -arg1 -arg2
# where the arguments get passed to the application
ENTRYPOINT ["java", "-Dspring.profiles.active-prod", "-jar", "rest-test-0.0.1-SNAPSHOT.jar"]
CMD []
# empty CMD is optional
# both must be JSON arrays, you do not want the `sh -c` wrapper