我正在嘗試使用子行程模塊自動運行 docker build 命令,如下所示:
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?
我似乎無法解決這個問題,而且我被困住了,因為我看不出我所做的與手動 ssh 進入實體并運行命令有何不同。
docker 守護行程肯定正在運行,因為我可以通過 ssh 終端手動構建。我嘗試更改 Dockerfile 的 rwx 權限以及 ec2 實體上的所有相關檔案,但這也無濟于事。
我該如何進行這項作業?我需要以編程方式做到這一點。
謝謝你。
uj5u.com熱心網友回復:
你的第一個問題是你只傳遞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,
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/434303.html
上一篇:argv如何使用execvp()傳遞給新的行程映像?
下一篇:bashfind命令,路徑為要求
