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)
如何解决这个问题,有什么想法吗?
为了以非 root 用户身份运行任务,您必须首先拥有该用户。首先在 Dockerfile 中创建用户和组,如下所示:
\n\nRUN groupadd -r <group name> && useradd --no-log-init -r -g <group name> <user name>" \nRun Code Online (Sandbox Code Playgroud)\n\n然后,您可以通过在 Dockerfile 中使用 \xe2\x80\x9cUSER \xe2\x80\x9d 以非 root 用户身份运行应用程序。参考Docker文档中的USER指令,我们可以看到:
\n\n这样,在运行ECS任务之前,您必须使用用户构建docker镜像并将其上传到ECR。
\n\n如果您在 Dockerfile 中不使用“USER”指令,则可以在创建 ECS 任务定义时使用用户名指定“user”参数作为替代方式。在任务定义中指定“用户”参数将强制以该用户身份运行您的应用程序。而且,该用户必须存在于docker镜像中,否则任务将无法启动。
\n\nECS任务定义中“用户”参数的格式可以如下:
\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}\nRun 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| 归档时间: |
|
| 查看次数: |
6682 次 |
| 最近记录: |