ECS 任务定义 - 覆盖 ENTRYPOINT 时,Docker 映像的 CMD 被删除

Jef*_*f V 6 amazon-ecs aws-fargate

我有一个使用以下 CMD 构建的 Docker 映像

# Dockerfile
...
CMD ["nginx", "-g", "daemon off;"]
Run Code Online (Sandbox Code Playgroud)

当我的任务定义不包含entryPoint或者command任务成功进入运行状态时。

{
  "containerDefinitions": [
    {
      "image": "<myregistry>/<image>",
      ...
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我需要在此容器的某些实例中运行代理,因此我使用entrypoint此任务来运行我的代理。问题是当我entryPoint向任务定义添加参数时,容器启动并立即停止。

这就是我正在做的添加entryPoint

{
  "containerDefinitions": [
    {
      "image": "<myregistry>/<image>",
      ...
      "entryPoint": [
        "custom-entry-point.sh"
      ],
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

这是以下内容custom-entry-point.sh

#!/bin/bash
/myagent &
echo "CMD is: $@"
exec "$@"
Run Code Online (Sandbox Code Playgroud)

为了证实我对 CMD 被删除的怀疑,日志仅显示:

CMD is: 
Run Code Online (Sandbox Code Playgroud)

如果我使用参数将 Dockerfile 中的 CMD 数组添加到任务定义中command,则它可以正常工作并且任务将启动:

{
  "containerDefinitions": [
    {
      "image": "<myregistry>/<image>",
      ...
      "entryPoint": [
        "custom-entry-point.sh"
      ],
      "command": [
        "nginx",
        "-g",
        "daemon off;"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

日志显示了预期的结果:

CMD is: nginx -g daemon off;
Run Code Online (Sandbox Code Playgroud)

我有许多带有各种迭代的 docker 映像CMD,我不想将它们复制到我的任务定义中。似乎仅向任务定义添加an不应该用空值entryPoint覆盖 docker 映像。CMD

希望一些 ECS/fargate 专家能够帮助阐明前进的道路。

小智 2

一些技巧:

  1. 检查您的入口点脚本是否可执行
  2. 使用入口点脚本的绝对路径
  3. 检查日志以查看错误。希望您自动配置了 awslog 驱动程序?
  4. 您是否在本地成功运行了入口点版本?

另请阅读本文以获得一些有用的背景: https://aws.amazon.com/blogs/opensource/demystifying-entrypoint-cmd-docker/