如何从Docker容器中控制主机?
例如,如何执行复制到主机的bash脚本?
根据情况,这可能是一个有用的资源。
这使用了作业队列(Celery),可以在主机上运行,命令/数据可以通过Redis(或rabbitmq)传递给它。在下面的示例中,这发生在django应用程序中(通常是docker化的)。
https://www.codingforentrepreneurs.com/blog/celery-redis-django/
您可以使用管道概念,但是使用主机上的文件和fswatch来实现从Docker容器中执行主机机器上的脚本的目标。像这样(自行承担风险):
#! /bin/bash
touch .command_pipe
chmod +x .command_pipe
# Use fswatch to execute a command on the host machine and log result
fswatch -o --event Updated .command_pipe | \
xargs -n1 -I "{}" .command_pipe >> .command_pipe_log &
docker run -it --rm \
--name alpine \
-w /home/test \
-v $PWD/.command_pipe:/dev/command_pipe \
alpine:3.7 sh
rm -rf .command_pipe
kill %1
/home/test # echo 'docker network create test2.network.com' > /dev/command_pipe
$ docker network ls | grep test2
8e029ec83afe test2.network.com bridge local
对user2915097的回答进行更详细的解释:
隔离的概念是能够清晰地限制应用程序/进程/容器(无论你从哪个角度看)对主机系统的操作。因此,能够复制和执行文件会破坏整个概念。
是的。但有时是必要的。
不。这并非如此,或者说Docker不是正确的选择。你应该为想要做的事情(例如更新主机配置)声明一个清晰的接口,并编写一个最小化的客户端/服务器来实现仅仅这个功能,而不是更多。然而,一般情况下,这似乎并不是很理想。在许多情况下,您应该重新考虑您的方法并消除那种需求。当基本上所有东西都是可通过某些协议访问的服务时,Docker应运而生。我想不出任何Docker容器获得在主机上执行任意内容的适当用例。
docker-compose.yml
和几个其他文件的文件夹 2.我git-clone这个仓库,cd进入它的目录并启动docker-compose up
3.结果我获得: -一个具有nginx/php-fpm/mysql等的Web服务器 -工作目录与我的主机系统上的项目代码 -…还将挂载到Web服务器上的某个文件夹。我相信获取项目代码意味着必须在Dockerfile内从主机运行几个命令? - pilat