Container env Does not match docker inspect results

I have been struggling to figure out environment variables and how to make them persist in my container. I have come to terms that you can’t just define an environment variable in the a Dockerfile and propagate it to the container without defining it during build. Since I don’t want to actually start my container as soon as it’s built I am using the create command instead of run and starting the container later.

So I am running something like:(some flags omitted for readability)
docker create -it --name=ContainerName -e LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1

Then I inspect the container I just created to check it’s enviornment:

sudo docker inspect -f “{{ .Config.Env }}” ContainerName
[LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]

Start the container
docker start ContainerName

Attach:
docker attach -ai ContainerName

Try to find my environment variable:
echo $LD_PRELOAD
No results here, just blank line

Check the envelope of the system and see it missing:

root@localhost:/# env
HOSTNAME=localhost.localdomain
TERM=xterm
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:.tar=01;31:.tgz=01;31:.arc=01;31:.arj=01;31:.taz=01;31:.lha=01;31:.lz4=01;31:.lzh=01;31:.lzma=01;31:.tlz=01;31:.txz=01;31:.tzo=01;31:.t7z=01;31:.zip=01;31:.z=01;31:.Z=01;31:.dz=01;31:.gz=01;31:.lrz=01;31:.lz=01;31:.lzo=01;31:.xz=01;31:.bz2=01;31:.bz=01;31:.tbz=01;31:.tbz2=01;31:.tz=01;31:.deb=01;31:.rpm=01;31:.jar=01;31:.war=01;31:.ear=01;31:.sar=01;31:.rar=01;31:.alz=01;31:.ace=01;31:.zoo=01;31:.cpio=01;31:.7z=01;31:.rz=01;31:.cab=01;31:.jpg=01;35:.jpeg=01;35:.gif=01;35:.bmp=01;35:.pbm=01;35:.pgm=01;35:.ppm=01;35:.tga=01;35:.xbm=01;35:.xpm=01;35:.tif=01;35:.tiff=01;35:.png=01;35:.svg=01;35:.svgz=01;35:.mng=01;35:.pcx=01;35:.mov=01;35:.mpg=01;35:.mpeg=01;35:.m2v=01;35:.mkv=01;35:.webm=01;35:.ogm=01;35:.mp4=01;35:.m4v=01;35:.mp4v=01;35:.vob=01;35:.qt=01;35:.nuv=01;35:.wmv=01;35:.asf=01;35:.rm=01;35:.rmvb=01;35:.flc=01;35:.avi=01;35:.fli=01;35:.flv=01;35:.gl=01;35:.dl=01;35:.xcf=01;35:.xwd=01;35:.yuv=01;35:.cgm=01;35:.emf=01;35:.ogv=01;35:.ogx=01;35:.aac=00;36:.au=00;36:.flac=00;36:.m4a=00;36:.mid=00;36:.midi=00;36:.mka=00;36:.mp3=00;36:.mpc=00;36:.ogg=00;36:.ra=00;36:.wav=00;36:.oga=00;36:.opus=00;36:.spx=00;36:.xspf=00;36:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
SHLVL=1
HOME=/root
_=/usr/bin/env

So the container defines this variable but it’s not actually available anywhere. Not sure how to make a simple thing like a global variable available in a container because it sure doesn’t seem to work right now.

Hi there,

I have the same problem.

That should work. At a very technical level, that should cause the environment variable to be set when the Docker environment launches the entrypoint process in the container.

What is the container actually running? LD_PRELOAD in particular is a pretty special environment variable and things that make an effort to protect the environment will frequently strip it out.

If you write this Dockerfile:

FROM ubuntu:16.04
ENV FOO=bar
CMD ["sh", "-c", "echo FOO is $FOO"]

Then you can

> docker build -t tmp .
> docker run tmp
FOO is bar
> docker run -e FOO=quux tmp
FOO is quux