【问题标题】:Python Script to run commands in a Docker container在 Docker 容器中运行命令的 Python 脚本
【发布时间】:2020-12-31 18:55:18
【问题描述】:

我目前正在使用主机上的 Python 脚本为 Docker 容器自动执行命令。这个 Python 脚本现在构建并运行一个 docker-compose 文件,容器的命令写入 docker-compose 文件和 Dockerfile 本身。

我想要做的是让 Python 脚本操作所有命令在容器内运行,所以如果我想要运行不同的脚本,我不会更改容器。我尝试了两种方法。

首先是在 Python 脚本中运行 os.system() 命令,但是,这只适用于打开容器的 shell,os.system() 命令不会在 Docker 容器本身中执行代码。

第二种方式在Dockerfile 中使用 CMD,但是,这是有限的,并且是硬编码到容器中的。如果我有多个脚本,我必须更改Dockerfile,我不想要这个。我想要的是构建一个运行所有服务的默认容器,然后在主机上运行 Python 脚本以在容器上运行一系列命令。

我对 Docker 还很陌生,我认为在容器上运行脚本命令时一定有一些我忽略的东西。我遇到的一种可能的解决方案是nsenter。这是一个可靠的解决方案吗?它是如何工作的?还是有更简单的方法?我还使用docker-volume 将 python 文件复制到容器中以在构建时运行,但是,我仍然找不到从主机自动访问和运行这些 python 脚本的解决方案。

【问题讨论】:

  • 最好将容器视为单个进程的包装器。鉴于您的管理流程,您不会尝试在该 Python 脚本中获取 Bourne shell 并运行命令;同样,您真的不应该尝试编写docker exec 脚本,而是将容器设置为自给自足。您能否举一个非常具体的示例,包括示例代码和相关的 Dockerfile 和 docker-compose.yml,说明您需要以这种方式执行的特定任务?
  • 我有一个 Python 应用程序,tkinter 用于 GUI,2 个容器,结果是用于威胁分析/工件的网络流量的 .pcap 文件。一个容器我有小型 python 脚本portscanner.py 等,另一个容器tcpdump。网络设置和卷与主机共享文件,但是,我在dockerfile 中使用CMD 来运行脚本。我希望能够从tkinter GUI 控制这些脚本的操作,而无需重新启动容器,只需传递命令来启动不同的脚本来运行。不是典型的 Docker 用例。它是一款轻量级的自动化对手仿真应用程序。

标签: python-3.x docker docker-compose nsenter


【解决方案1】:

如果需要将脚本复制到正在运行的容器中,您可以通过docker cp 命令执行此操作。例如docker cp myscript.sh mycontiainer:/working/dir.

脚本进入容器后,您可以通过docker exec 命令运行它们。例如docker exec -it mycontainer /working/dir/myscript.sh

请注意,这不是常见的做法。通常,您需要的脚本将被构建(而不是复制)到容器映像中。然后,当您想在容器中执行脚本时,您可以通过docker run 命令运行容器。例如docker run -it mycontainerimage /working/dir/myscript.sh

【讨论】:

  • 谢谢,设置就像一个 CTF,其中有易受攻击的容器(带有易受攻击的服务)和一个“攻击”或挑战容器以及在主机上运行的 Python Tkinter 前端。我希望用户能够在挑战容器中运行脚本,而不必每次都重新构建容器,只需选择脚本即可。如果我使用docker run,我可以选择不同的脚本吗?我与主机有一个共享卷,我的所有脚本都在共享docker volume 中,如果所有脚本都驻留在容器中,我可以调用不同的脚本吗?是这样的吗?
  • 是的,它的工作方式相同。但是您会在构建时嵌入脚本(使用共享卷,它们可以在运行时进行修改)。由于容器不可变通常是最佳实践,因此在运行时复制它们会更好。无论哪种方式,当您想运行不同的脚本时,您只需使用 docker run 来执行此操作,类似于我在回答中的方式。
猜你喜欢
  • 2015-03-30
  • 1970-01-01
  • 2022-01-13
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 2019-03-08
  • 1970-01-01
相关资源
最近更新 更多