运行 docker-与Python的'fabric'组合
Running docker-compose up with Python's 'fabric'
我正在使用 Docker(+ Docker 撰写)。所有 docker-compose
交互都是通过 Python 'fabric' 包 (v1) 进行的。
示例:
def runserver():
local('docker-compose up')
和:
$ fab runserver
一切正常,直到我尝试 ^C
从 运行 docker-compose up
:
docker-compose
似乎收到 ^C
(SIGINT
?) 信号,因为它开始停止我的容器 - 例如:
Stopping celery-export ... done
Stopping celery ...
但是在容器停止过程中(如果容器没有正确响应信号,有时长达 10 秒),我可以按 enter / return 并查看/与我的 [=57= 交互](好像进程已经结束)。
虽然在这个阶段容器还没有完成停止(每个 Stopping ...
行旁边没有 done
)。就好像我过早地获得了我可以自由使用的 shell 的访问权限。如果一个延迟完成的容器最终停止(通常在 10 秒后),它会在我当前在我的终端中所做的事情上绘制 done
线。
示例:
Stopping celery-export ... done
Stopping celery ...
Stopping redis ...
$ uptime
10:54 up 1 day, 17:22, 2 users, load averages: 1.73 1.94 1.92
Stopping celery ... done
Stopping redis ... done
当我直接(在 fabric 之外)调用 docker-compose up
时不会发生这种情况,所以我怀疑这与 fabric 包装命令的执行有关。
预期的行为是我无法访问我的 shell,直到容器停止过程完成。
请原谅我在描述这个问题时缺少适当的术语,如果这对超级用户而不是 SO 更合适。
我愿意回答,我的回答是我对你问题的看法:
- fabric 运行 配置和停止的命令。
- docker-编写命令:Builds, (re)creates, starts, and attaches to containers for a service。当关键字是 attach 时。当你 运行:
docker-compose up
那么最后的操作就是attach
到容器(服务)。
例如下一个 docker-compose.yaml:
version: "3.6"
services:
nginx:
image: nginx:latest
ports:
- "8080:80"
如果你 运行 docker-compose up
你会看到下一个输出:
Starting fabric_nginx_1 ... done
Attaching to fabric_nginx_1
当Attaching to fabric_nginx_1
成功结束与nginx服务器的连接。
发送到此控制台的 Ctrl-C 或 SIGINT 将停止 nginx 进程和容器(服务)。
对于 运行 process/container/service 作为守护进程,您应该 运行 docker-compose 分离并使用 -d/--detach 开关。
docker-compose up -d
那么您的服务将运行作为一项服务。对于停止,你应该使用:
结论:在您的情况下,所有工作均按设计进行。 Fabric 运行 是一个 docker-compose 命令并停止。 docker-compose
创建容器,运行 它们然后停止。 container的行为是将自己的内容打包到container中。
我在测试时使用 docker-compose up
(在 Fabric 之外)。通常,当我按 ctrl+C 时,在我返回到命令提示符之前并非所有图像都已终止。事实上,Redis 经常在后台熬夜 运行。 Re运行 docker-compose up
甚至导致显示自 ctrl+C 以来累积的 Redis 消息。
在我的例子中,一个合适的解决方法来确保一切都是 "dead",我使用 docker kill $(docker ps -q)
。这会杀死任何 运行 个图像。
正如其他人所提到的,在您的情况下使用 Ctrl+C 似乎会破坏 Fabric。 SSH 命令仍 运行 在后台运行,您将其输出发送到控制台直到它完成。
我建议您使用 docker-compose up -d
而不是这样做,以便在所有容器启动后 Fabric 完成。如果你想跟踪日志,你应该添加另一个将执行 docker-compose logs
的 Fabric 命令。当你 Ctrl+C 那个时,它应该很快结束,而不是像 up
那样在后台 运行。当你想停止容器时,使用 docker-compose stop
.
Fabric 1.x 已拆分为两个项目,'Invoke' (inv
) 是 运行 本地命令的替换包,这里有相关内容。
Invoke 在这方面做了很大的改进,不再有这个问题。从 Fabric 1.x 迁移到 Invoke 相对容易。我看不到 Fabric 1.x 有任何修复的可能性。我的解决方案是改为使用 Invoke。
我正在使用 Docker(+ Docker 撰写)。所有 docker-compose
交互都是通过 Python 'fabric' 包 (v1) 进行的。
示例:
def runserver():
local('docker-compose up')
和:
$ fab runserver
一切正常,直到我尝试 ^C
从 运行 docker-compose up
:
docker-compose
似乎收到^C
(SIGINT
?) 信号,因为它开始停止我的容器 - 例如:
Stopping celery-export ... done
Stopping celery ...
但是在容器停止过程中(如果容器没有正确响应信号,有时长达 10 秒),我可以按 enter / return 并查看/与我的 [=57= 交互](好像进程已经结束)。
虽然在这个阶段容器还没有完成停止(每个 Stopping ...
行旁边没有 done
)。就好像我过早地获得了我可以自由使用的 shell 的访问权限。如果一个延迟完成的容器最终停止(通常在 10 秒后),它会在我当前在我的终端中所做的事情上绘制 done
线。
示例:
Stopping celery-export ... done
Stopping celery ...
Stopping redis ...
$ uptime
10:54 up 1 day, 17:22, 2 users, load averages: 1.73 1.94 1.92
Stopping celery ... done
Stopping redis ... done
当我直接(在 fabric 之外)调用 docker-compose up
时不会发生这种情况,所以我怀疑这与 fabric 包装命令的执行有关。
预期的行为是我无法访问我的 shell,直到容器停止过程完成。
请原谅我在描述这个问题时缺少适当的术语,如果这对超级用户而不是 SO 更合适。
我愿意回答,我的回答是我对你问题的看法:
- fabric 运行 配置和停止的命令。
- docker-编写命令:Builds, (re)creates, starts, and attaches to containers for a service。当关键字是 attach 时。当你 运行:
docker-compose up
那么最后的操作就是attach
到容器(服务)。
例如下一个 docker-compose.yaml:
version: "3.6"
services:
nginx:
image: nginx:latest
ports:
- "8080:80"
如果你 运行 docker-compose up
你会看到下一个输出:
Starting fabric_nginx_1 ... done
Attaching to fabric_nginx_1
当Attaching to fabric_nginx_1
成功结束与nginx服务器的连接。
发送到此控制台的 Ctrl-C 或 SIGINT 将停止 nginx 进程和容器(服务)。
对于 运行 process/container/service 作为守护进程,您应该 运行 docker-compose 分离并使用 -d/--detach 开关。
docker-compose up -d
那么您的服务将运行作为一项服务。对于停止,你应该使用:
结论:在您的情况下,所有工作均按设计进行。 Fabric 运行 是一个 docker-compose 命令并停止。 docker-compose
创建容器,运行 它们然后停止。 container的行为是将自己的内容打包到container中。
我在测试时使用 docker-compose up
(在 Fabric 之外)。通常,当我按 ctrl+C 时,在我返回到命令提示符之前并非所有图像都已终止。事实上,Redis 经常在后台熬夜 运行。 Re运行 docker-compose up
甚至导致显示自 ctrl+C 以来累积的 Redis 消息。
在我的例子中,一个合适的解决方法来确保一切都是 "dead",我使用 docker kill $(docker ps -q)
。这会杀死任何 运行 个图像。
正如其他人所提到的,在您的情况下使用 Ctrl+C 似乎会破坏 Fabric。 SSH 命令仍 运行 在后台运行,您将其输出发送到控制台直到它完成。
我建议您使用 docker-compose up -d
而不是这样做,以便在所有容器启动后 Fabric 完成。如果你想跟踪日志,你应该添加另一个将执行 docker-compose logs
的 Fabric 命令。当你 Ctrl+C 那个时,它应该很快结束,而不是像 up
那样在后台 运行。当你想停止容器时,使用 docker-compose stop
.
Fabric 1.x 已拆分为两个项目,'Invoke' (inv
) 是 运行 本地命令的替换包,这里有相关内容。
Invoke 在这方面做了很大的改进,不再有这个问题。从 Fabric 1.x 迁移到 Invoke 相对容易。我看不到 Fabric 1.x 有任何修复的可能性。我的解决方案是改为使用 Invoke。