ECS Fargate 上的 EFS 挂载 - 非 root 用户的读/写权限被拒绝

ash*_*hen 11 amazon-ecs node.js docker amazon-efs aws-fargate

我有一个 ECS Fargate 容器,运行具有非 root 权限的 Nodejs 应用程序,并且还安装到容器内 /.user_data 上的 EFS。

我遵循了这个AWS 教程。我的设置几乎相似。

这是 Docker 文件:

FROM node:12-buster-slim

RUN apt-get update && \ 
    apt-get install -y build-essential \
    wget \
    python3 \
    make \
    gcc \ 
    libc6-dev  \
    git

# delete old user
RUN userdel -r node 

# Run as a non-root user
RUN addgroup "new_user_group" && \
useradd "new_user" --gid "new_user_group" \
--home-dir "/home/new_user"

RUN git clone https://github.com/test-app.git /home/new_user/app

RUN chown -R new_user:new_user_group /home/new_user

RUN mkdir -p /home/new_user/.user_data 
RUN chown -R new_user:new_user_group /home/new_user/.user_data
RUN chmod -R 755 /home/new_user/

WORKDIR /home/new_user/app

RUN npm install

RUN npm run build

EXPOSE 1880

USER new_user

CMD [ "npm", "start" ]
Run Code Online (Sandbox Code Playgroud)

当节点应用程序尝试在 /.user_data 内部写入时,我收到读写权限被拒绝错误。

如果我以 root 身份运行容器,应用程序就能够读取/写入数据。

我尝试使用 UID 和权限添加 EFS 访问点,但这也没有帮助。

请注意:Dockerfile 在我的本地计算机上运行良好。

Mei*_*bay 8

更新

\n

阅读此博文 -将 Amazon EFS 与 Amazon ECS 和 AWS Fargate \xe2\x80\x93 结合使用的开发人员指南第 2 部分 > POSIX 权限

\n

可能与分配给 ECS 任务的 IAM 角色的 IAM 策略相关。

\n
\n

“...如果 AWS 策略不允许 ClientRootAccess 操作,您的用户将被压缩为预定义的 UID:GID,即 65534:65534。从此时起,将应用标准 POSIX 权限:该用户可以做什么do 由 POSIX 文件系统权限决定。例如,除 65534:65534 之外的任何 UID:GID 所拥有的文件夹,其值为 666(rw 代表所有者,rw 代表所有人)将允许该保留用户创建文件。但是,由除 65534:65534 之外的任何 UID:GID 拥有的文件夹,其具有 644(rw 代表所有者,r 代表所有人)将不允许这个被压缩的用户创建文件。”

\n
\n
\n

确保您的 root-dir 权限设置为777. 这样任何 UID 都可以读/写这个目录。

\n

为了不那么宽松,请将 root-dir 设置755为默认设置,请参阅文档。这提供read-write-execute给 root 用户、read-execute组和read-execute所有其他用户。

\n

如果没有对其父目录(目录)的读取访问权限,则用户(UID)无法访问(读取)子目录。

\n

您可以使用Docker轻松测试它,这是一个简单的示例

\n

创建一个Dockerfile -

\n
FROM ubuntu:20.04\n\n# Fetch values from ARGs that were declared at the top of this file\nARG APP_NAME\nARG APP_ARTIFACT_DIR\nARG APP_HOME_DIR="/app"\nARG APP_USER_NAME="appuser"\nARG APP_GROUP_ID="appgroup"\n\n# Define workdir\nENV HOME="${APP_HOME_DIR}"\nWORKDIR "${HOME}"\n\nRUN apt-get update -y && apt-get install tree\n\n# Define env vars\nENV PATH="${HOME}/.local/bin:${PATH}"\n\n# Run as a non-root user\nRUN addgroup "${APP_GROUP_ID}" && \\\n    useradd "${APP_USER_NAME}" --gid "${APP_GROUP_ID}" --home-dir "${HOME}" && \\\n    chown -R ${APP_USER_NAME} .\n\nRUN mkdir -p rootdir && \\\n    mkdir -p rootdir/subdir && \\\n    touch rootdir/root.file rootdir/subdir/sub.file  && \\\n    chown -R root:root rootdir && \\\n    chmod 600 rootdir rootdir/root.file && \\\n    chmod -R 775 rootdir/subdir\n
Run Code Online (Sandbox Code Playgroud)\n

您应该使用chmod 600chmod -R 775,尝试不同的权限集,例如777644,并看看它是否有意义。

\n

构建镜像、运行容器并测试权限 -

\n
FROM ubuntu:20.04\n\n# Fetch values from ARGs that were declared at the top of this file\nARG APP_NAME\nARG APP_ARTIFACT_DIR\nARG APP_HOME_DIR="/app"\nARG APP_USER_NAME="appuser"\nARG APP_GROUP_ID="appgroup"\n\n# Define workdir\nENV HOME="${APP_HOME_DIR}"\nWORKDIR "${HOME}"\n\nRUN apt-get update -y && apt-get install tree\n\n# Define env vars\nENV PATH="${HOME}/.local/bin:${PATH}"\n\n# Run as a non-root user\nRUN addgroup "${APP_GROUP_ID}" && \\\n    useradd "${APP_USER_NAME}" --gid "${APP_GROUP_ID}" --home-dir "${HOME}" && \\\n    chown -R ${APP_USER_NAME} .\n\nRUN mkdir -p rootdir && \\\n    mkdir -p rootdir/subdir && \\\n    touch rootdir/root.file rootdir/subdir/sub.file  && \\\n    chown -R root:root rootdir && \\\n    chmod 600 rootdir rootdir/root.file && \\\n    chmod -R 775 rootdir/subdir\n
Run Code Online (Sandbox Code Playgroud)\n

  • 谢谢!我成功了。我必须在 EFS 上创建一个访问点,其 UID 和 GID 与我在容器中创建的新用户相匹配。 (2认同)