运行 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:

  1. 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 更合适。

我愿意回答,我的回答是我对你问题的看法:

  1. fabric 运行 配置和停止的命令。
  2. 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

那么您的服务将运行作为一项服务。对于停止,你应该使用:

  1. docker-compose stop
  2. docker-compose kill
  3. docker-compose down

结论:在您的情况下,所有工作均按设计进行。 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。