I am trying to understand the entrypoint behavior of Docker images, specifically related to what is returned by dirname
when running executables directly via docker run
. (The following is a contrived example, but representative of a real issue I’m trying to work through.)
Using the following Dockerfile to create an image named entrypoint
:
FROM ubuntu:18.04
COPY entrypoint.sh /opt/entrypoint/
RUN chmod +x /opt/entrypoint/entrypoint.sh
ENV PATH ${PATH}:/opt/entrypoint
ENTRYPOINT [ "/bin/bash" ]
And the following bash script installed under /opt/entrypoint
:
#!/bin/bash
echo "Current directory: `pwd`"
echo "Directory name: `dirname $0`"
echo "Script name: `basename $0`"
When I run entrypoint.sh
as an argument to docker run
, I unexpectedly get the following:
$ docker run -it entrypoint entrypoint.sh
Current directory: /
Directory name: .
Script name: entrypoint.sh
When I run entrypoint.sh
from inside the container, I get the following:
$ docker run -it entrypoint
root@98b127cd16ca:/# entrypoint.sh
Current directory: /
Directory name: /opt/entrypoint
Script name: entrypoint.sh
root@98b127cd16ca:/#
Questions:
- When I run
entrypoint.sh
as an argument todocker run
, why doesdirname
return.
instead of/opt/entrypoint
? - What should I be doing differently in the
docker run ... entrypoint.sh
scenario to getdirname
to behave as expected?