How come the following, i.e. echoing $PATH
directly from bash -c
:
docker exec -i -t my_container bash -c "echo $PATH"
returns a different value for $PATH
than what follows, i.e. starting an interactive bash session and echoing the $PATH
?
docker exec -i -t my_container bash
root@21e6d898c3c2:/# echo $PATH
To give some context to this question, I'd like to run a command in the container with docker exec
, and this command is on the path if I start an interactive bash session, but isn't if I just run the command.
Using the full path of the executable isn't a workaround in this case, as the command relies on other environment variables that, just like PATH
are set in a bash interactive session, but not if I run the command up straight.
Best Answer
When
-c
is specifiedbash
is not running as interactive or a login shell so it won't read the same startup scripts. Anything set in/etc/profile
,~/.bash_profile
,~/.bash_login
, or~/.profile
would definitely be skipped.Also, as explained by the
bash
man page:So if it doesn't think you're connecting across the network it might not read the
.bashrc
file either which would skip everything not skipped by the previous step.solution
To work around this issue I would create a script that sets the
PATH
to something suitable and then run the command. If you want to use the existing.profile
or other files then you can just source it in your script.