'How to pass options to a docker ENTRYPOINT?
Consider the command:
ls [OPTION]... [FILE]...
Options come first, and then comes the file. However, somehow, I have no idea why, ls
does not insists on this order. Therefore ls -la /home
and ls /home -la
produce identical output.
We can use this quirk to send options to a ls
that knows its [FILE]
argument.
FROM ubuntu:22.04
ENTRYPOINT ["ls", "/home"]
Then passing arguments is the same as passing options:
$ docker build -t test .
$ docker run test
$ docker run test -la
total 8
drwxr-xr-x 2 root root 4096 Apr 18 10:28 .
drwxr-xr-x 1 root root 4096 May 12 16:58 ..
However some programs insist on the order of options and arguments. For instance a .jar
with a Spring server application:
This works as intended:
java -jar -Dspring.profiles.active=ci backend.jar
This does not:
java -jar backend.jar -Dspring.profiles.active=ci
The [COMMAND]
and [ARG...]
in docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
seem to be appended to the entrypoint and not inserted.
Is there any way to pass options instead of arguments to a docker ENTRYPOINT
?
Solution 1:[1]
Everything that you use as CMD
, may it be from the Dockerfile or when running the image, is passed to the ENTRYPOINT
as arguments.
You can create a more sophisticated entrypoint, preferable via script.
#!/usr/bin/env sh
exec java -jar $@ backend.jar
I am using $@
which are all the args passed to the script, effectively the CMD
.
Additionally, I am using exec
to make the final java
command run with process ID (pid) 1, so that it receives signals properly. For example SIGTERM
.
Solution 2:[2]
Assuming you want to keep the java -jar backend.jar
part, you can add a tiny shell script that takes the arguments you put at the end and passes them before. See the selected answer here for details on how to do that
Solution 3:[3]
You can use CMD
for this.
ENTRYPOINT ["java"]
CMD ["-jar", "-Dspring.profiles.active=ci", "backend.jar"]
This also allows you to change the parameters at runtime. E.g.
docker run <image> -jar -Dspring.profiles.active=debug backend.jar
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | Liel Fridman |
Solution 3 |