无法通过 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,
)
我正在尝试使用子进程模块自动运行 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,
)