我尝试使用 subprocess 模块从 Python 脚本将 docker 命令作为子进程运行,但出现以下错误。
b“未知标志:--mount 请参阅“docker buildx build --help”。 ”
我尝试运行的脚本代码是,
command = 'docker build -f /root/magneto/docker_env/Dockerfile.build -t magneto_build /root/magneto && docker run -ti --mount src=$(pwd),dst=/tmp/magneto/build,type=bind -e BUILD_NUMBER=${BUILD_NUMBER:-local} magneto_build'
command_args = shlex.split(command)
p = subprocess.Popen(command_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, error = p.communicate()
输出变量为空,并且错误被接收到错误变量中。
我还尝试使用 pexpect 库,只是为了检查我是否使用正确的库和函数,但这也引发了相同的错误
请提出此问题的原因以及可能的解决方案。
问题是您正在
two命令上运行
shlex.split
,这显然需要 shell。
要么简单地使用
shell=True
并传入一个字符串;
result = subprocess.run(
'docker build -f /root/magneto/docker_env/Dockerfile.build -t magneto_build /root/magneto && docker run -ti --mount src=$(pwd),dst=/tmp/magneto/build,type=bind -e BUILD_NUMBER=${BUILD_NUMBER:-local} magneto_build'.
shell=True, text=True, check=True, capture_output=True)
output = result.stdout
error = result.stderr
或者煞费苦心地重构它以避免 shell 功能(包括但不限于命令替换和变量插值)。
还要注意这如何避免裸露的
Popen
;就像它的文档清楚地告诉你的那样,你应该尽可能使用 subprocess.run()
和朋友。