How to execute the Entrypoint of a Docker images at each "exec" command?

Doubidou picture Doubidou · May 1, 2017 · Viewed 10.4k times · Source

After trying to test Dockerfiles with Dockerspec, I finally had an issue I can't resolve properly.

The problem is, I think, from Docker itself ; If I understand its process, an Entrypoint is only executed at run, but if the container stay started and I launch an "exec" command in, it's not re-called.

I think it's the wanted behavior.

But if the Entrypoint is a "gosu" script which precede all my commands, it's a problem...


Example

"myImage" has this Entrypoint : gosu 1000:1000 "$@"

If I launch : docker run -it myImage id -u

The output is "1000".

If I start a container : docker run -it myImage bash

In this container, id -u outputs "1000".

But if I start a new command in this container, it starts a new shell, and does not execute the Entrypoint, so : docker exec CONTAINER_ID id -u

Output "0", because the new shell is started as "root".


It there a way to execute each time the entrypoint ? Or re-use the shell open ?

Or a better way to do that ?

Or, maybe I haven't understand anything ? ;)

Thanks !


EDIT

After reading solutions proposed here, I understand that the problem is not how Docker works but how Serverspec works with ; my goal is to directly test a command as a docker run argument, but Serverspec start a container and test commands with docker exec.

So, the best solution is to found how get the stdout of the docker run executed by Serverspec.

But, in my personal use-case, the best solution is maybe to not use Gosu but --user flag :)

Answer

Derick Bailey picture Derick Bailey · May 1, 2017

if your goal is to run the docker exec with a specific user inside of the container, you can use the --user option.

docker exec --user myuser container-name [... your command here]

If you want to run gosu every time, you can specify that as the command with docker exec

docke exec container-name gosu 1000:1000 [your actual command here]

in my experience, the best way to encapsulate this into something easily re-usable is with a .sh script (or .cmd file in windows).

drop this into a file in your local folder... maybe gs for example.

#! /bin/sh
docker exec container-name gosu 1000:1000 "$@"

give it execute permissions with chmod +x gs and then run it with ./gs from the local folder