在使用docker-compose up时,在主机上运行Docker脚本

23
我的问题与如何在docker-compose up指令中运行脚本的最佳实践有关。目前,我通过在主机和容器之间共享一个卷来实现使脚本更改对主机和容器都可见,就像一个监视脚本轮询配置文件中的更改一样。脚本必须根据预定义的规则在主机上处理更改。 如何在docker-compose up指令或服务的Dockerfile中启动此脚本,以便每当容器启动时,“watcher”都可以找到正在进行的任何更改并进行写入。 所涉及的容器将始终在Debian / Ubuntu操作系统上运行,并且应该是体系结构无关的,这意味着它也应该能够在ARM上运行。 我希望在主机上运行脚本,而不是在容器内运行。我需要主机更改其网络接口配置,以便轻松适应任何环境,我重申..这对用户来说应该是无缝的,并且可以在运行在容器内的Web界面上轻松编辑,以适应新环境。 我目前使用基于crontab在主机上运行的脚本来执行此操作。我只是想知道如何从容器内部运行主机上的脚本的最佳实践和示例,以便安装操作员只需运行docker-compose up即可轻松部署。

1
你看过这个链接吗: "如何从Docker容器中运行主机上的shell脚本?"? - tgogos
是的,我尝试过了,但是要么是我没有理解这个命令,要么就是它根本不起作用。如果你手头有一个Ubuntu镜像的Docker,请尝试以下操作:$ docker run --rm --privileged -v /sbin/:/sbin ubuntu /sbin/ifconfig然后执行:$ ifconfig 我错过了什么吗? - Ilhicas
1
第一条命令打印有关容器的信息(在我的情况下,eth0 得到了 172.17.0.2),第二条命令打印有关主机的信息。问题出在哪里? - tgogos
那么,这与仅运行容器并运行docker exec -it container bash ifconfig有何不同?如何使用--priviliged指令在主机上运行命令?我不是指ifconfig而是任何shell / bash脚本? - Ilhicas
3个回答

5
我想知道如何在容器内部从主机运行脚本的最佳实践和示例,以便安装操作员只需运行docker-compose up即可轻松部署。似乎没有适用于你情况的最佳实践,但建议在此处提出一个解决方案:如何从docker容器中在主机上运行shell脚本?,可以使用客户端/服务器技巧:

  1. 主机应运行一个小型服务器(选择一个端口并指定您要等待的请求类型)
  2. 容器在启动后,应向该服务器发送此请求
  3. 然后主机应运行脚本/触发您想要的更改

这可能会存在严重的安全问题,请自行承担风险。


好的,我会将您的答案标记为正确的,因为您实际上提供了一种不同的方法来使用主机上的脚本,轮询共享卷的更改。鉴于这个问题似乎没有一个具体的答案,但是关于安全问题,我不得不不同意您的观点。Docker并不是用来创建安全层的,而是为了方便移植(直接运输),如果您的容器已经被攻击,那么您已经陷入了深深的麻烦中,因为docker守护程序在主机上以root身份运行,您在没有root访问权限的情况下运行docker,从而使其具有root访问权限... - Ilhicas
现在有太多关于某些东西的担忧,而这些东西并不是在Docker中作为设计构建的。如今,即使是裸机虚拟化程序也不安全,并且会在虚拟机之间泄露信息。Docker的理念本质上是避免依赖地狱并允许快速部署。系统一直都存在被攻击的风险,人类因素也难以避免。让容器具备与主机通信的能力与其他任何方式下Web服务被攻击没有什么区别。 - Ilhicas
谢谢,Docker在不断发展,这里的答案可能很快就会过时。我们可以关注它,并看看未来会添加哪些选项... - tgogos
我将在此留下一个链接,供尝试在Docker主机内从其他容器运行Docker容器并正在寻找有用信息的人使用。从Docker容器内部运行Docker命令 http://tdeheurles.github.io/acting-on-docker-from-inside-docker/ - Ilhicas
1
一个简单的钩子基础设施在docker-compose中,确实有助于处理一些类似开发环境的场景,比如vagrant有办法在vagrant up期间运行自定义脚本等。 - Shyam Habarakada

-1

脚本需要在前台持续运行。

在您的Dockerfile中使用CMD指令,并将脚本定义为参数。

使用cli时,请使用docker run -d IMAGE SCRIPT


1
我不确定你是否理解了问题。我的意思是,当容器启动时,我需要在主机上运行一个脚本,以便容器和主机之间可以相互通信,这样我就可以更改主机上的当前网络配置。CMD指令将在正在运行的容器内部运行脚本,而不是在托管机器内部运行,也不应该运行。 - Ilhicas
你的问题不是很清楚。容器并不打算与主机交互。您可以使用 docker run --network=host 来绕过这个问题,直接使用主机的网络堆栈来公开容器。您还可以在容器内挂载主机的文件系统。看起来你需要一个包装脚本或者重新思考如何使用 Docker。 - Creek

-4

您可以为docker-compose up创建一个别名。在Ubuntu中,将以下内容放入~/.bash_aliases文件中:

alias up="docker-compose up; ~/your_script.sh"

我不确定在容器内运行宿主机脚本是否可行,但如果可行的话,那将是一个严重的安全漏洞。容器应该是隔离的,这就是使用容器的目的。


谢谢你的回答,这是一个进步,但它与脚本调用compose up和运行脚本没有太大区别。 关于安全方面的担忧,它与运行任何连接到互联网的Web应用程序或应用程序相同。对于这种用例,隔离方面并不像部署跨所有平台方面那样重要。该脚本是预定义的,而且不能由用户编辑,也不能注入字符,并且不会给用户提供shell访问权限。仅用于信号脚本的调用,避免主动轮询等。谢谢 - Ilhicas
2
我的担忧是关于在主机上执行代码。假设一个用户在容器中添加了可以在主机上执行的内容。简单的 ssh -R 可能会暴露您的基础设施。无论如何,决定承担风险还是不承担风险由您自己决定,我只是想提醒您知道这一点。此外,我建议您阅读 @tgogos 提供的链接。 - charli
在发布这个问题之前,我就已经看到@charli讨论允许容器在主机上运行的话题似乎是大多数人避而不谈的。但是,当我回答tgogos时,也许我错过了某个命令,但脚本始终在容器上运行而不是在主机上运行。但我可能误解了这个命令,如果你们能指点我正确的方向,我将非常感激。 - Ilhicas

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