在Docker容器中运行命令的Python脚本

3
我目前正在使用主机上的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,说明您需要使用这种方式执行的特定任务吗? - David Maze
我有一个Python应用程序,使用tkinter作为GUI,有2个容器,结果是用于威胁分析/工件的网络流量的.pcap文件。一个容器中有小型Python脚本portscanner.py等,另一个容器中有tcpdump。网络已设置和卷以与主机共享文件,但是我在dockerfile中使用CMD来运行脚本。我希望能够通过tkinter GUI控制这些脚本的操作,而无需重新启动容器,只需传递命令以启动不同的脚本运行即可。这不是典型的Docker用例。它是一个轻量级的自动对抗仿真应用程序。 - Chris Maze
1个回答

2
如果需要将脚本复制到正在运行的容器中,可以使用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中,如果所有脚本都驻留在容器中,我可以调用不同的脚本吗?它是这样工作的吗? - Chris Maze
是的,它的工作方式是相同的。但是您需要在构建时嵌入脚本(使用共享卷,可以在运行时进行修改)。由于通常最佳实践是容器不可变的,因此在运行时将其复制会更好。无论哪种方式,当您想要运行不同的脚本时,只需使用docker run来执行,类似于我在答案中提供的方式。 - sfb103

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接