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
调试命令。
前提条件:
- 使用 [DC/OS 通用容器运行时] 启动的容器(/mesosphere/dcos/cn/2.1/deploying-services/containerizers/)
使用在容器内运行的命令传送输出
您可以使用 dcos task exec
命令在容器内运行命令。此例中,启动了一个长期运行的 Marathon 应用程序,然后使用 dcos task exec
命令获取运行此应用程序的节点的主机名。
-
创建 Marathon 应用定义,并使用以下内容为其命名
my-app.json
{ "id": "/my-app", "cmd": "sleep 100000000", "cpus": 1, "instances": 1 }
-
在 DC/OS 上部署服务:
dcos marathon app add my-app.json
-
使用此 CLI 命令获取作业的任务 ID:
dcos task
输出应与此类似:
NAME HOST USER STATE ID my-app 10.0.1.106 root R <task_id>
-
运行此命令以显示运行应用程序的容器的主机名,其中
<task-ID>
是您的任务 ID。dcos task exec <task_id> hostname
输出应与此类似:
ip-10-0-1-105.us-west-2.compute.internal
有关 dcos task exec
命令的更多信息,请参阅 CLI 参考部分.
在任务容器内运行交互命令
您可以使用 dcos task exec
命令,在群集中的机器上运行交互命令。此例中,dcos task exec
命令用来将简单脚本从本地计算机复制到节点上的任务容器。然后使用 dcos task exec
命令对脚本进行管理。
-
创建 Marathon 应用定义,并使用以下内容为其命名
my-interactive-app.json
{ "id": "/my-interactive-app", "cmd": "sleep 100000000", "cpus": 1, "instances": 1 }
-
在 DC/OS 上部署应用程序:
dcos marathon app add my-interactive-app.json
-
使用此 CLI 命令获取应用程序的任务 ID:
dcos task
输出应与此类似:
NAME HOST USER STATE ID my-interactive-app 10.0.1.106 root R <task_id>
-
用以下内容编写名为
hello-world.sh
的脚本:echo "Hello World"
-
将脚本上传到任务容器:
cat hello-world.sh | dcos task exec -i <task_id> bash -c "cat > hello-world.sh"
-
提供文件可执行权限:
dcos task exec <task_id> chmod a+x hello-world.sh
-
在容器内运行脚本:
dcos task exec <task_id> ./hello-world.sh
输出应与此类似:
Hello World
启动长期运行的交互式 Bash 会话
此例中,长期运行的 作业 通过使用 dcos job run
命令来启动,dcos task exec
命令用于在该作业的容器内启动交互式 Bash shell。
-
使用 DC/OS CLI 部署和运行作业:
-
创建以下应用定义并另存为
my-job.json
. 这将指定运行10000000
秒的休眠作业。{ "id": "my-job", "labels": {}, "run": { "artifacts": [], "cmd": "sleep 100000000", "cpus": 0.01, "disk": 0, "env": {}, "maxLaunchDelaySeconds": 300, "mem": 32, "placement": { "constraints": [] }, "restart": { "policy": "NEVER" }, "volumes": [] } }
-
使用此 CLI 命令部署该作业:
dcos job add my-job.json
-
验证作业是否已成功部署:
dcos job list
输出应类似于:
ID DESCRIPTION STATUS LAST SUCCESFUL RUN my-job Unscheduled None
-
运行作业:
dcos job run my-job
-
-
使用此 CLI 命令获取作业的任务 ID:
dcos task
输出应与此类似:
NAME HOST USER STATE ID 20161209183121nz2F5.my-job 10.0.2.53 root R <task_id>
-
在容器内部启动一个指定了任务 ID(
<task_id>
)的进程,并将 TTY 附加到该进程。这将启动交互式 Bash 会话。dcos task exec --interactive --tty <task_id> bash
您现在应该是位于运行交互式 Bash 会话 的容器内部。
root@ip-10-0-2-53 / #
-
从交互式 Bash 会话运行一个命令。例如
ls
命令:root@ip-10-0-1-104 / # ls bin dev home lib64 media opt root sbin sys usr boot etc lib lost+found mnt proc run srv tmp var
提示
您可以简写,例如 -i
的--interactive
或 -t
的 --tty
. 此外,只需要 <task_id>
的开头唯一字符。例如,如果您的任务 ID 是 exec-test_20161214195
并且没有以字母 e
开头的其他任务 ID,则有效的命令语法如下:dcos task exec -i -t e bash
如需更多信息,请参阅 CLI 命令 [参考]。(/mesosphere/dcos/cn/2.1/cli/command-reference/).