使用 dcos task exec

在任务容器内使用 dcos task exec 命令

命令允许您在任务的容器内执行任意命令,并将其输出返回到本地终端,以了解有关某个特定任务如何表现的更多信息。它提供了非常类似于 docker exec 体验,不需要 SSH 密钥。

要使用调试功能,必须使用 Mesos 容器运行时或通用容器运行时来启动服务或作业。调试不能用于用 Docker 运行时启动的容器。如需更多信息,请参阅 。

您可以在下列模式下执行此命令。

  • dcos task exec <task-id> <command>(无标记):将 STDOUT 和 STDERR 作为原始字节从远程终端传输到本地终端。

  • dcos task exec --tty <task-id> <command>:将 STDOUT 和 STDERR 从远程终端传输到本地终端,但不作为原始字节。相反,此选项将本地终端置于原始模式,分配远程伪终端 (PTY),并通过远程 PTY 来传输 STDOUT 和 STDERR。

  • dcos task exec --interactive <task-id> <command> 将 STDOUT 和 STDERR 从远程终端传输到本地终端,并将 STDIN 从本地终端传输到远程命令。

  • dcos task exec --interactive --tty <task-id> <command>:将 STDOUT 和 STDERR 从远程终端传输到本地终端,并将 STDIN 从本地终端传输到远程终端。此外,还将本地终端置于原始模式,分配远程伪终端 (PTY),并通过远程 PTY 传输 STDOUT、STDERR 和 STDIN。此模式提供最大功能。

有关 dcos task exec 命令的更多信息,请参阅 CLI 参考部分

  • 为方便查看,我们已经包含了上述完整标记的文本,但每一个都可以缩短。不是输入 --interactive,您只需输入 -i。同样,不是输入 --tty,您只需输入 -t
  • 如果您的模式传输原始字节,您将无法启动 vim 等类似程序,因为这些程序需要使用控制字符。

快速入门

使用本指南开始使用 dcos task exec 调试命令。

前提条件:

  • 使用 [DC/OS 通用容器运行时] 启动的容器(/mesosphere/dcos/cn/1.13/deploying-services/containerizers/)

使用在容器内运行的命令传送输出

您可以使用 dcos task exec 命令在容器内运行命令。此例中,启动了一个长期运行的 Marathon 应用程序,然后使用 dcos task exec 命令获取运行此应用程序的节点的主机名。

  1. 创建 Marathon 应用定义,并使用以下内容为其命名 my-app.json

  2. 在 DC/OS 上部署服务:

    1. dcos marathon app add my-app.json
    1. dcos task

    输出应与此类似:

    1. NAME HOST USER STATE ID
    2. my-app 10.0.1.106 root R <task_id>
  3. 运行此命令以显示运行应用程序的容器的主机名,其中 <task-ID> 是您的任务 ID。

    1. dcos task exec <task_id> hostname

    输出应与此类似:

    1. ip-10-0-1-105.us-west-2.compute.internal

有关 dcos task exec 命令的更多信息,请参阅 。

在任务容器内运行交互命令

您可以使用 dcos task exec 命令,在群集中的机器上运行交互命令。此例中,dcos task exec 命令用来将简单脚本从本地计算机复制到节点上的任务容器。然后使用 dcos task exec 命令对脚本进行管理。

  1. 创建 Marathon 应用定义,并使用以下内容为其命名 my-interactive-app.json

    1. "id": "/my-interactive-app",
    2. "cpus": 1,
    3. "instances": 1
    4. }
  2. 在 DC/OS 上部署应用程序:

    1. dcos marathon app add my-interactive-app.json
  3. 使用此 CLI 命令获取应用程序的任务 ID:

    输出应与此类似:

    1. NAME HOST USER STATE ID
    2. my-interactive-app 10.0.1.106 root R <task_id>
  4. 用以下内容编写名为 hello-world.sh 的脚本:

    1. echo "Hello World"
  5. 将脚本上传到任务容器:

    1. cat hello-world.sh | dcos task exec -i <task_id> bash -c "cat > hello-world.sh"
  6. 提供文件可执行权限:

    1. dcos task exec <task_id> chmod a+x hello-world.sh
  7. 在容器内运行脚本:

    1. dcos task exec <task_id> ./hello-world.sh
    1. Hello World

启动长期运行的交互式 Bash 会话

此例中,长期运行的 作业 通过使用 dcos job run 命令来启动,dcos task exec 命令用于在该作业的容器内启动交互式 Bash shell。

  1. 使用 DC/OS CLI 部署和运行作业:

    1. 创建以下应用定义并另存为 my-job.json。这将指定运行 10000000 秒的休眠作业。

      1. {
      2. "id": "my-job",
      3. "labels": {},
      4. "run": {
      5. "artifacts": [],
      6. "cmd": "sleep 100000000",
      7. "cpus": 0.01,
      8. "env": {},
      9. "mem": 32,
      10. "placement": {
      11. "constraints": []
      12. },
      13. "restart": {
      14. "policy": "NEVER"
      15. },
      16. "volumes": []
      17. }
      18. }
    2. 使用此 CLI 命令部署该作业:

    3. 验证作业是否已成功部署:

      1. dcos job list

      输出应类似于:

      1. ID DESCRIPTION STATUS LAST SUCCESFUL RUN
      2. my-job Unscheduled None
    4. 运行作业:

      1. dcos job run my-job
  2. 使用此 CLI 命令获取作业的任务 ID:

    1. dcos task

    输出应与此类似:

    1. NAME HOST USER STATE ID
    2. 20161209183121nz2F5.my-job 10.0.2.53 root R <task_id>
  3. 在容器内部启动一个指定了任务 ID(<task_id>)的进程,并将 TTY 附加到该进程。这将启动交互式 Bash 会话。

    1. dcos task exec --interactive --tty <task_id> bash

    您现在应该是位于运行交互式 Bash 会话 的容器内部。

    1. root@ip-10-0-2-53 / #

提示