从子进程运行时未识别 docker '--mount' 标志

问题描述 投票:0回答:1

我尝试使用 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 库,只是为了检查我是否使用正确的库和函数,但这也引发了相同的错误

请提出此问题的原因以及可能的解决方案。

python-3.x docker subprocess mount
1个回答
0
投票

问题是您正在

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()
和朋友。

© www.soinside.com 2019 - 2024. All rights reserved.