在Python中正确自动化Docker脚本

基于本教程构buildTF图像分类器,我有一个bash shell,在其中运行Docker镜像,并使用以下命令:

docker run --name fooldocker -it -v $HOME/tf_files:/tf_files/ gcr.io/tensorflow/tensorflow:latest-devel 

然后在这个泊坞窗图像中运行我的Python脚本:

 python /tf_files/label_image.py /tf_files/myimages exit 

有用。

但现在, 我需要在Python脚本中自动执行这些命令 。 我试过了 :

 p = Popen(['docker', 'run', '--rm', '--name', 'fooldocker','-it', '-v', '$HOME/tf_files:/tf_files/', 'gcr.io/tensorflow/tensorflow:latest-devel'], stdout=PIPE) p = Popen(['docker', 'exec', 'fooldocker', 'python', '/tf_files/label_NES.py', '/tf_files/NES/WIP']) p = Popen(['docker', 'kill', 'fooldocker'], shell=True, stdout=PIPE, stderr=PIPE) p = Popen(['docker', 'rm', 'fooldocker'], shell=True, stdout=PIPE, stderr=PIPE) 

在Popen#2运行后导致此错误:

 docker: Error response from daemon: create $HOME/tf_files: "$HOME/tf_files" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. 

问题是$HOME不能在这个单引号string中被评估。 要么尝试双引号,要么事先评估variables并将其放入命令string中。

另外:如果你设置shell = True,你不会把你的命令分割成一个列表:

 p = Popen('docker kill fooldocker', shell=True, stdout=PIPE, stderr=PIPE) 

这是因为Popen没有把你的家庭解读$HOME你的家乡之路。 它是string$HOME并传递给docker命令,它不允许在卷名中使用$

也许你可以使用subprocess模块来方便,例如:

 import subprocess subprocess.call("echo $HOME", shell=True) 

它解释$HOME如果shell=True指定。