tini icon indicating copy to clipboard operation
tini copied to clipboard

Using "docker run --init" with arguments to tini

Open paradoxon82 opened this issue 2 years ago • 3 comments

Hello,

using tini directly in the dockerfile works well so far. However, ideally I would like it to be transparent, so that the dockerfile does not have to be changed Using "docker run --init" works, but then I cannot add flags to the tini call. Is there any way to do it?

Best regards, Daniel

paradoxon82 avatar Jul 19 '23 11:07 paradoxon82

I think this is something that should be proposed to the docker community, I'm not sure that @krallin has the decision on this

AgustinRamiroDiaz avatar Feb 18 '24 21:02 AgustinRamiroDiaz

I've found a way to do it, but it's not ergonomic

docker run --init --entrypoint docker-init test -g -s -- <fill with your CMD>
test.sh && sh trap.sh"

Explanation:

  • by adding --init the docker-init binary is added to the container (I don't know how, there's a vague description here)
  • --entrypoint only accepts one "word", so we need to add all the parameters we want from tini to the command in the end. This includes all the -g -s -- ...
  • given the previous point, we are overwriting the image's CMD, so we need to explicitly add all of the commands there again, making it very little ergonomic since we need to gather the same commands from the Dockerfile
  • the -s option is added given that (for a reason I don't know) specifying the --entrypoint doesn't assign PID 1, so we need to handle zombie processes with the -s option. More on that here

AgustinRamiroDiaz avatar Feb 18 '24 21:02 AgustinRamiroDiaz

I've found a way to do it, but it's not ergonomic

The current docker documentation about run --entrypoint actually gives an example like that. We can obtain the same result with --entrypoint '' image-name docker-init -g -s -- cmd

In either case, it actually runs docker-init twice! i.e. /sbin/docker-init -- docker-init -g -s -- /test.sh

Thankfully, tini's behavior can also be controlled with environment variables, so I think for now the proper way if all you want is passing the -g option is to do: run --init --env TINI_KILL_PROCESS_GROUP=1

johan-boule avatar Aug 10 '24 17:08 johan-boule