使用 dcos task exec

BETA

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

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

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

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

  • 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 调试命令。

前提条件:

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

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

  1. 创建 Marathon 应用定义,并使用以下内容为其命名 my-app.json
    1. {
    2. "id": "/my-app",
    3. "cmd": "sleep 100000000",
    4. "cpus": 1,
    5. "instances": 1
    6. }
  2. 在 DC/OS 上部署服务:
    1. dcos marathon app add my-app.json
  3. 使用此 CLI 命令获取作业的任务 ID:
    1. dcos task
    输出应与此类似:
    1. NAME HOST USER STATE ID
      my-app 10.0.1.106 root R <task_id>
  4. 运行此命令以显示运行应用程序的容器的主机名,其中 <task-ID> 是您的任务 ID。
    1. dcos task exec <task_id> hostname
    输出应与此类似:
    1. ip-10-0-1-105.us-west-2.compute.internal
有关 dcos task exec 命令的更多信息,请参阅 CLI 参考部分。 # 在任务容器内运行交互命令 您可以使用 dcos task exec 命令,在群集中的机器上运行交互命令。此例中,dcos task exec 命令用来将简单脚本从本地计算机复制到节点上的任务容器。然后使用 dcos task exec 命令对脚本进行管理。
  1. 创建 Marathon 应用定义,并使用以下内容为其命名 my-interactive-app.json
    1. {
    2. "id": "/my-interactive-app",
    3. "cmd": "sleep 100000000",
    4. "cpus": 1,
    5. "instances": 1
    6. }
  2. 在 DC/OS 上部署应用程序:
    1. dcos marathon app add my-interactive-app.json
  3. 使用此 CLI 命令获取应用程序的任务 ID:
    1. dcos task
    输出应与此类似:
    1. NAME HOST USER STATE ID
      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. "disk": 0,
      9. "env": {},
      10. "maxLaunchDelaySeconds": 300,
      11. "mem": 32,
      12. "placement": {
      13. "constraints": []
      14. },
      15. "restart": {
      16. "policy": "NEVER"
      17. },
      18. "volumes": []
      19. }
      20. }

    2. 使用此 CLI 命令部署该作业:

      1. dcos job add my-job.json

    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 / #

  4. 从交互式 Bash 会话运行一个命令。例如 ls 命令:

    1. root@ip-10-0-1-104 / # ls
    2. bin dev home lib64 media opt root sbin sys usr
    3. boot etc lib lost+found mnt proc run srv tmp var

提示

您可以使用简写,例如 —interactive-i—tty-t。此外,只需要 <task_id> 的开头唯一字符。例如,如果您的任务 ID 是 exec-test_20161214195 并且没有以字母 e 开头的其他任务 ID,则有效的命令语法如下:dcos task exec -i -t e bash。如需更多信息,请参阅 CLI 命令 参考