Python set environment variables for docker-machine on Mac OS X
Question: As I'm continuing to work in docker-machine and Django, I'm trying to make a
setup script for my project that auto-detects platform and decides how to set
up Docker and the required containers. Auto-detection works fine. One thing I
can't figure out is how to automatically set the environment variables needed
for `docker-machine` to work on Mac OS X. Currently, the script will just tell
the user to manually set the environment variable using the command

    
    
    eval $(docker-machine env dev)
    

where `dev` is the name of the VM. This prompt happens after initial setup is
successfully completed. The user is told to do this because the following
subprocess call does not actually set the environment variables:

    
    
    subprocess.call('eval $(docker-machine env dev)', shell=True)
    

If an error occurs during creating the VM because the VM already exists, then
I use subprocess to see if Docker is already installed:

    
    
    check_docker = subprocess.check_call('docker run hello-world', shell=True)
    

If this call is successful, then the script tells the user that Docker was
already installed and then prompts the user to manually set the environment
variables to be able to start the containers needed for the Django server to
run. I had originally thought that the script behaved correctly in this
scenario, but it turns out that it only appeared that way because I had
already set the environment variables manually. Of course, I see now that the
`docker run` command needs the environment variables to be set in order to
work, and since the environment variables never get set in the script, the
`docker run` test doesn't work. So, how am I supposed to correctly set the
environment variables from Python? It seems like using subprocess is resulting
in the wrong environment getting these variables set. If I do something like

    
    
    subprocess.call('setdockerenv.sh', shell=True)
    

where `setdockerenv.sh` has the correct `eval` command, then I run into the
same problem, which I'm guessing is rooted in using subprocess. Would `os`
have something to do this properly where `subprocess` can't? It's important
that I do this in the Python script, or else having the user manually set the
environment variables and then manually test to see if docker is installed
defeats the purpose of having the script.


Answer: You cannot use `subprocess` to change the environment, since any changes it
makes are local to that process. Instead, (as you found) you can change your
_current_ environment via `os.environ`, and that is inherited by any other
processes you subsequently create.

