如何在ECS中运行非Root用户

Man*_*nny 3 amazon-web-services amazon-ecs docker

我构建了这个镜像并将其推送到我的 ECR 存储库

FROM ubuntu:latest

RUN useradd -ms /bin/bash toto_user

USER toto_user
Run Code Online (Sandbox Code Playgroud)

然后,我将此用户添加到我的任务定义 toto_user 中。即使作为 root 用户,该任务也未运行。如果我通过 SSH 连接到该 ec2 并运行以下命令,它就会正常工作:

docker run -v /:/host -it 09999999999.dkr.ecr.us-east-1.amazonaws.com/hello-world:avocado_secret_theft1
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题,有什么想法吗?

sha*_*aws 6

为了以非 root 用户身份运行任务,您必须首先拥有该用户。首先在 Dockerfile 中创建用户和组,如下所示:

\n\n
RUN groupadd -r <group name> && useradd --no-log-init -r -g <group name> <user name>" \n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,您可以通过在 Dockerfile 中使用 \xe2\x80\x9cUSER \xe2\x80\x9d 以非 root 用户身份运行应用程序。参考Docker文档中的USER指令,我们可以看到:

\n\n
    \n
  • USER 指令设置运行映像时以及 Dockerfile 中跟随的任何 RUN、CMD 和 ENTRYPOINT 指令时使用的用户名(或 UID)以及可选的用户组(或 GID)。您可以使用 \xe2\x80\x9cUSER\xe2\x80\x9d 语句来标记运行时的 docker 容器应以 \xe2\x80\x9c\xe2\x80\x9d 用户身份运行。欲了解更多信息,您可以参考[1][2]。
  • \n
\n\n

这样,在运行ECS任务之前,您必须使用用户构建docker镜像并将其上传到ECR。

\n\n

如果您在 Dockerfile 中不使用“USER”指令,则可以在创建 ECS 任务定义时使用用户名指定“user”参数作为替代方式。在任务定义中指定“用户”参数将强制以该用户身份运行您的应用程序。而且,该用户必须存在于docker镜像中,否则任务将无法启动。

\n\n

ECS任务定义中“用户”参数的格式可以如下:

\n\n
    \n
  • 用户
  • \n
  • 用户:组
  • \n
  • uid
  • \n
  • uid:gid
  • \n
  • 用户:gid
  • \n
  • 用户 ID:组
  • \n
\n\n

请注意,Windows 容器不支持此参数。有关“user”参数的更多详细信息,请参阅我们的公开文档[3]。

\n\n

例如,以下是我的任务定义的片段:

\n\n
{\n  "containerDefinitions": [\n    {\n        .\n        .\n      "user": \xe2\x80\x9c<user name>\xe2\x80\x9d, ### The task will be run as <user name>. \n      "privileged": null,\n        .\n        .\n    }\n  ],\n    .\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后,请注意,以非 root 用户身份运行可能会带来其自身的挑战,例如,如果您在 80 上启动一个进程来监听,这是非 root 用户无法做到的。

\n\n

参考:

\n\n

[1] 用户 - 编写 Dockerfile 的最佳实践\n https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user

\n\n

[2] https://docs.docker.com/engine/reference/builder/#user

\n\n

[3] 任务定义参数 - 容器定义 - https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#container_definitions

\n