在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
指定。
- 在Mac容器的Docker中缺less回车
- 如何在Docker容器中获取本地主机IP地址?
- 在容器中设置ENVvariables不工作,是否在容器运行时执行“/ usr / local / bin”下的每一个?
- 应该使用临时docker容器删除一个卷?
- 如何在Docker容器中执行命令作为bash shell脚本的一部分
- 为什么在dockerfile运行指令的/ bin / bash -c“…”部分中,echo $ VARIABLE,在docker build上返回空?
- 如何把两个bash命令在CWL文件中?
- 脚本在构build失败,但从Docker容器工作
- 从AWS CLI启动EC2实例时,未执行用户数据脚本