【发布时间】:2021-09-21 00:07:56
【问题描述】:
我想在我的 AWS ECS/Fargate 集群上的公共 Docker 映像中启动一个交互式 shell,以便从集群内部运行网络/连接测试。
似乎官方的做法是使用aws ecs run-task 后跟aws ecs execute-command [1][2]
如果可能,我想使用现有的公共 Docker Hub 映像,而不是构建自定义映像。
如果我在没有命令或默认命令的情况下运行 do run-task,任务将退出,execute-command 将无法处理已退出的任务。
"Essential container in task exited"
如果我设置sleep 10000 的 Docker 命令,我会得到:
"CannotStartContainerError: ResourceInitializationError: failed to create new container runtime task: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: \"sleep 10000\": executable file not found in $PATH: unknown",
理想情况下,run-task 和 execute-command 将在一个步骤中组合在一起。我不希望后台任务无限期地运行,我希望 shell 以交互方式运行一些命令,这些命令在我完成后会被清理。我将如何实现这一目标?
[2]https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html
【问题讨论】:
-
我很困惑。如果您只需要/想要运行命令然后退出,为什么要启动任务然后
ecs exec进入它?正确的模式是启动覆盖entrypoint/command的命令,并使用您要使用的命令 no? -
所以,我想运行一个交互式 shell 命令,而不仅仅是任何命令。交互式 shell 支持是一项新功能,大多数 ECS 并非为此而设计。我可以在 ECS 任务定义中指定或覆盖入口点/命令。我需要使用
execute-command来获取交互式外壳(AFAIK)。 -
因此,如果您需要与 shell 交互,那么是的,您需要使用
ecs exec。 Mark 提供的建议似乎是实现它的好方法。 -
您的主要问题已经在下面得到解答,但是您在尝试运行
sleep 10000时收到的错误消息是因为您无意中要求运行一个字面意思为“sleep 10000”的二进制文件。参数被接受为一个数组,因此最简单的方法是指定"sleep", "10000"而不是"sleep 10000"。如果你最终还想运行一个小 shell 脚本,你可以改用"sh", "-c", "sleep 10000"之类的东西。
标签: amazon-web-services docker amazon-ecs aws-fargate