随着我继续在docker-machine和Django中工作,我正在为我的项目制作一个设置脚本,该脚本会自动检测平台并决定如何设置Docker和所需的容器。自动检测正常工作。有一件事我无法弄清楚是如何自动设置为在Mac OS X上运行目前,该脚本将只是告诉用户需要docker-machine
环境变量使用命令在Mac OS X上设置Docker-machine的Python环境变量
eval $(docker-machine env dev)
手动设置环境变量
其中dev
是VM的名称。此提示发生在初始设置成功完成后。用户被告知这样做,因为下面的子进程调用实际上并没有设置环境变量:如果在创建虚拟机,因为虚拟机已经存在时发生错误
subprocess.call('eval $(docker-machine env dev)', shell=True)
,然后我用的子进程,看看码头工人是已经安装:
check_docker = subprocess.check_call('docker run hello-world', shell=True)
如果调用成功,那么脚本告诉泊坞窗已安装的用户,然后提示用户手动设置环境变量能够启动所需的Django服务器容器跑步。我原本以为脚本在这种情况下表现正确,但事实证明它只是以这种方式出现,因为我已经手动设置了环境变量。当然,我现在看到docker run
命令需要设置环境变量才能工作,并且由于环境变量从未在脚本中设置,因此docker run
测试不起作用。那么,我该如何正确设置Python的环境变量?看来使用子进程会导致设置这些变量的错误环境。如果我这样做
subprocess.call('setdockerenv.sh', shell=True)
其中setdockerenv.sh
具有正确的eval
命令,然后我遇到了同样的问题,我猜是植根于使用子。 os
有什么可以做到这一点,subprocess
不能?在Python脚本中这样做很重要,否则让用户手动设置环境变量,然后手动测试以查看是否安装了docker,这是否会影响脚本的使用目的。
您无法使用其他进程修改当前进程的环境; 'eval'可以工作,因为作为一个内置的shell,它不会分叉另一个进程,而是在当前进程中执行。通过运行Python脚本无法修改当前shell的环境。 – chepner
为了回应这个迟到而道歉,但是,是的,那就是问题所在。你能把它变成答案吗?另外,我能够通过使用'os.environ'并手动设置环境变量来解决我的问题。我想这是为运行脚本的Python进程设置env变量,以便子进程可以使用这些变量。 –