Home > Software engineering >  How to pass options to a docker ENTRYPOINT?
How to pass options to a docker ENTRYPOINT?

Time:05-13

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?

CodePudding user response:

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.

CodePudding user response:

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

CodePudding user response:

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
  • Related