skip to Main Content

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?

3

Answers


  1. 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

    Login or Signup to reply.
  2. 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.

    Login or Signup to reply.
  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
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search