无法通过 ssh 和 python 的子进程模块 运行 Docker 命令

Can't run Docker command via ssh and python's subprocess module

我正在尝试使用子进程模块自动运行 docker 构建命令:

command = "docker build -t image_name ."

ssh_command = "ssh -o 'StrictHostKeyChecking=no' -i 'XXXXX.pem' ubuntu@" + cur_public_ip + " " + command

retval = subprocess.run(command.split(" "), stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)

if retval.stderr != '':
    print('Error trace: ')
    print(retval.stderr)
else:
    print("Docker image succesfully built.")
    print(retval.stdout)

有趣的是,如果我在手动 SSH 到我的 ec2 实例后 运行 这个命令(作为命令变量的字符串),它工作正常。

但是当我运行上面的代码时,我得到这个错误:

Error trace: 
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

我似乎无法解决这个问题,而且我被卡住了,因为我看不出我在做什么与手动 sshing 到实例和 运行ning 命令有什么不同。

docker 守护程序绝对是 运行ning,因为我可以通过 ssh 终端手动构建。我试过更改 EC2 实例上 Dockerfile 和所有相关文件的 rwx 权限,但这也没有帮助。

如何进行这项工作?我需要以编程方式能够做到这一点。

谢谢。

您的第一个问题是您仅将 command 传递给 subprocess.run,因此您在本地 运行 docker build

                        +--- look here
                        |
                        v
retval = subprocess.run(command.split(" "), stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)

您的第二个问题是您在 ssh_command 中进行了大量引用,这将导致许多问题。例如,如所写,您会将 文字 字符串 'StrictHostKeyChecking=no' 传递给 ssh,导致如下错误:

command-line: line 0: Bad configuration option: 'stricthostkeychecking

因为您不是通过 shell 执行命令,所以所有这些引号都将在命令行中逐字传递。

与其调用 command.split(" "),不如将命令构建为列表,如下所示:

import subprocess

cur_public_ip = "1.2.3.4"
command = ["docker", "build", "-t", "image_name", "."]

ssh_command = [
    "ssh",
    "-o",
    "stricthostkeychecking=no",
    "-i",
    "XXXXX.pem",
    f"ubuntu@{cur_public_ip}",
] + command

retval = subprocess.run(
    ssh_command,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    universal_newlines=True,
)