ECS特权容器非root用户执行Docker命令遇权限拒绝求助
问题描述
本地使用自定义镜像以runner非root用户启动容器时,可正常执行Docker命令;但在ECS任务中指定user = "runner"运行时,提示权限不足,取消用户指定后命令可正常执行。
相关配置
Dockerfile内容:
RUN groupadd "runner" && useradd -g "runner" --shell /bin/bash "runner" \ && mkdir -p "/home/runner" \ && chown -R "runner":"runner" "/home/runner" RUN usermod -aG docker "runner" WORKDIR /home/runner USER runner
本地测试成功场景:
❯ docker run --user runner -ti -v /var/run/docker.sock:/var/run/docker.sock github-runner-entrypoint:0.8 /bin/bash runner@62514eaea867:~$ /usr/bin/docker version --format '{{.Server.APIVersion}}' 1.41 runner@62514eaea867:~$
ECS任务失败配置(Terraform容器定义):
user = "runner" entrypoint = ["/bin/bash", "-c"] command = ["/bin/mount && /bin/docker run debian:latest /bin/ls"]
排查与解决方案
核心原因
ECS宿主机上/var/run/docker.sock的所属用户组ID,和容器内docker用户组的ID不匹配,导致容器内的runner用户没有权限访问Docker套接字。本地环境中宿主机与容器的docker组ID一致,所以runner加入该组后能正常访问;但ECS宿主机的docker组ID通常与本地不同,容器内runner对应的组ID无访问权限。
解决步骤
确认ECS宿主机docker组ID
登录ECS宿主机执行以下命令,获取docker组的GID:getent group docker | cut -d: -f3修改Dockerfile对齐组ID
在Dockerfile中创建docker组时指定与ECS宿主机一致的GID(假设获取到的GID为999):RUN groupadd "runner" && useradd -g "runner" --shell /bin/bash "runner" \ && mkdir -p "/home/runner" \ && chown -R "runner":"runner" "/home/runner" # 用ECS宿主机的docker组ID创建组 RUN groupadd -g 999 docker && usermod -aG docker "runner" WORKDIR /home/runner USER runner重新构建镜像并部署到ECS即可解决权限问题。
动态适配组ID(无需修改镜像)
如果无法重新构建镜像,可在ECS任务命令中添加动态调整组ID的逻辑:entrypoint = ["/bin/bash", "-c"] command = ["getent group docker || groupadd -g $(stat -c '%g' /var/run/docker.sock) docker; usermod -aG docker runner; /bin/mount && /bin/docker run debian:latest /bin/ls"]该命令会先检查容器内是否存在对应GID的
docker组,不存在则根据docker.sock的组ID创建,再将runner加入组,最后执行原业务命令。权限验证方法
可在ECS任务中先执行以下命令,确认权限匹配情况:ls -l /var/run/docker.sock && id runner检查输出中
docker.sock的组ID是否包含在runner用户的组列表中。
内容的提问来源于stack exchange,提问作者S1c0r4x
相关产品推荐
相关产品推荐

