需要在python脚本内运行docker run命令

2ledvvac  于 2022-12-03  发布在  Docker
关注(0)|答案(5)|浏览(159)

我的Docker命令是:

docker run --rm wappalyzer/cli https://wappalyzer.com

当我运行python脚本时:

#!/usr/bin/python
from subprocess import call
import json
import os
import docker

docker run --rm wappalyzer/cli "MYURL"

上面写着

File "t.py", line 7
    docker run --rm wappalyzer/cli "MYURL"
             ^
SyntaxError: invalid syntax

我的操作系统是ubuntu14.04,我正在使用ubuntu终端。

g6ll5ycj

g6ll5ycj1#

正如@AndyShinn所说,Python不是一种shell语言,但是你可以像运行shell命令一样调用docker:

#!/usr/bin/python
import subprocess

with open("/tmp/output.log", "a") as output:
    subprocess.call("docker run --rm wappalyzer/cli https://wappalyzer.com", shell=True, stdout=output, stderr=output)

使用这种方法,您不需要导入Docker。

bvn4nwqk

bvn4nwqk2#

这不是有效的Python代码。如果你只是想运行一个容器并将一个命令作为参数传递,你可以这样做:

#!/usr/bin/env python
import sys
import docker

image = "wappalyzer/cli"

client = docker.from_env()
client.containers.run(image,  sys.argv[1], True)

但是如果你想了解Python和运行Python进程的话,你应该多读一些。Python不是一种shell语言,你不能只使用shell命令内联。

tzxcd3kk

tzxcd3kk3#

您可以使用名为docker的pip包并使用它来连接到Docker。在subProcess中运行命令与此解决方案的区别在于格式。您可以管理映像、容器以及CLI所能执行的所有操作。
点击此处查看:https://docker-py.readthedocs.io/en/stable/
样品:

import docker
client = docker.from_env()

client.containers.run("ubuntu", "echo hello world")

# or

client.containers.run("bfirsh/reticulate-splines", detach=True)

# you can even stream your output like this:
for line in container.logs(stream=True):
   print(line.strip())

所有代码示例都可以在我提到的源URL中找到。

vsnjm48y

vsnjm48y4#

更新日期:2021年3月22日

我们现在有了python-on-whales一个Python的Docker客户端,可以在Linux、macOS和Windows上运行,适用于Python 3.7及以上版本。

>>> from python_on_whales import docker
>>> output = docker.run("hello-world")
>>> print(output)
Hello from Docker! This message shows that your installation appears to be 
working correctly.
>>> from python_on_whales import DockerClient
>>> docker = DockerClient(compose_files=["./my-compose-file.yml"])
>>> docker.compose.build()
>>> docker.compose.up()
...
>>> docker.compose.down()
n3schb8v

n3schb8v5#

this answer的边缘情况和参数化如下。
使用subprocess.run也比使用subprocess.call更好

import docker
import subprocess
import os
import time

def main():
    client, log_path = _set_up_environment()
    _run_docker_compose("docker-compose-with-rabbit.yaml", log_path)

def _run_docker_compose(docker_compose_name, log_path):
    bash_command = f"docker-compose -f {docker_compose_name}} up -d"
    _execute_shell_command(bash_command, log_path)

def _execute_shell_command(bash_command, log_path):
    with open(log_path, "w") as output:
        subprocess.run(
            bash_command,
            shell=True,  # pass single string to shell, let it handle.
            stdout=output,
            stderr=output
        )
    while not output.closed:
        time.sleep(0.1)
    print(f"{os.linesep} COMMAND {bash_command} LOG OUTPUT:")
    with open(log_path, "r") as output:
        for line in output:
            print(line)

def _create_docker_log_file():
    log_location, log_name = "logs", "output.log"
    log_path = os.path.join(os.getcwd(), log_location, log_name)
    os.makedirs(os.path.dirname(log_path), exist_ok=True)
    assert os.path.isdir(os.path.dirname(log_path))
    if not os.path.isfile(log_path):
        os.mknod(log_path)

    return log_location, log_name, log_path

def _set_up_environment():
    log_location, log_name, log_path = _create_docker_log_file()
    client = docker.from_env()
    return client, log_path

if __name__ == "__main__":
    main()

相关问题