skip to Main Content

Where are the environment variables located on a docker container, more precisely, where is ENV=1 stored from the following:

$ docker run --rm -e ENV=1 -it ubuntu:16.04 bash
root@40e384fc9c1f:/# env
HOSTNAME=40e384fc9c1f
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:
ENV=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
SHLVL=1
HOME=/root
_=/usr/bin/env

All linux docs I read pointed to either: /etc/environment, ~/.bashrc, ~/.bash_profile, and ~/profile, but when dumped those files, I saw nothing related to declaration of ENV=1.

Is it perhaps something specific to docker and how it sets up the environment?

2

Answers


  1. If a variable is specified as an option when executing a Docker command, the Docker image is read-only, so it is likely to be stored only in memory, not in the file.

    Login or Signup to reply.
  2. When you run docker run -e VAR=value some-image, the container has a single process, and the environment variable is set in that process’s environment. It’s not in any particular file. The lowest-level Unix function to run a command is execve(2) and in that system call you just pass the new command’s environment as parameters.

    Locally, try running

    export ANYTHING=value
    env | grep ANYTHING
    grep ANYTHING ~/.profile
    

    and you’ll similarly notice that the environment variable is set; running env(1) as a subprocess sees it; but it doesn’t exist in any of the files you mention.

    Normally in Docker, none of the files you mention are read at all. It’s highly likely that the standard shell isn’t GNU bash; if you’re using an Alpine-based image, you may not even have a /bin/bash. None of this is a problem, but it means that you should usually ignore shell dotfiles.

    Instead, to set an environment variable in an image, use the Dockerfile ENV directive. When you docker build the image, that value will be persisted, and you can see its value if you docker inspect the image, but it’s not directly accessible on disk anywhere and it won’t be visible in any of the dotfiles you mention.

    As an example:

    FROM alpine
    
    # Set an environment variable using ENV
    ENV VAR_1=from-dockerfile-env
    
    # These won't work at all
    RUN echo 'export VAR_2=from-etc-profile' >> /etc/profile
    RUN echo 'export VAR_3=from-etc-bashrc' >> /etc/bashrc
    
    # Also has no effect
    RUN echo 'export VAR_4=from-source-script' > /source-script.sh
    RUN echo 'source /source-script.sh' >> /etc/profile
    
    # _Also_ has no effect
    RUN export VAR_5=from-dockerfile-run
    
    # When you run the container, see what is set (only $VAR_1)
    CMD env | grep VAR
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search