Node.js ECS Fargate上的EFS装载-非root用户的读/写权限被拒绝

Node.js ECS Fargate上的EFS装载-非root用户的读/写权限被拒绝,node.js,docker,amazon-ecs,aws-fargate,efs,Node.js,Docker,Amazon Ecs,Aws Fargate,Efs,我有一个ECS Fargate容器,它运行一个具有非root权限的nodejs应用程序,并在容器内的/user\u数据上挂载到EFS 我遵循AWS教程。我的设置几乎相似 这是Docker文件: FROM node:12-buster-slim RUN apt-get update && \ apt-get install -y build-essential \ wget \ python3 \ make \ gcc \ li

我有一个ECS Fargate容器,它运行一个具有非root权限的nodejs应用程序,并在容器内的/user\u数据上挂载到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" ]
当节点应用程序尝试写入/.user_内部数据时,我获得的读写权限被拒绝错误

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

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

谢谢你的帮助

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

更新 阅读此博客帖子-

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

“…如果AWS策略不允许ClientRootAccess操作,您的用户将被压缩为预定义的UID:GID,即65534:65534。从这一点开始,标准POSIX权限将适用:此用户可以执行的操作由POSIX文件系统权限决定。例如,任何UID:GID(65534:65534除外)拥有的文件夹(所有者为rw,所有人为rw)将允许此保留用户创建文件。但是,任何UID:GID(65534:65534除外)拥有的文件夹(所有者为rw,所有人为r)将不允许此压缩用户创建文件。“


确保您的根目录权限设置为
777
。这样,任何UID都可以读取/写入此目录

若要降低权限,请将根目录设置为默认设置的
755
。这将为根用户提供
read-write-execute
,为组用户提供
read-execute
,为所有其他用户提供
read-execute

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

您可以轻松地使用进行测试,下面是一个快速示例

创建一个-

您应该使用
chmod 600
chmod-R 775
,尝试不同的权限设置,例如
777
644
,然后看看是否有意义

生成映像、运行容器并测试权限-

docker build Boy来自北方。
docker run--rm-it Boyfrom North bash
root@e0f043d9884c:~$su appuser
$ls-la
总数12
drwxr-xr-x 1 appuser root 4096 Jan 30 12:23。
drwxr-xr-x 1根根目录4096 Jan 30 12:33。。
drw--------3根根根4096 Jan 30 12:23根目录
$ls rootdir
ls:无法打开目录“rootdir”:权限被拒绝

谢谢!我尝试更改目录权限,但没有帮助。我在原始问题中添加了Dockerfile。该文件在我的本地计算机上运行正常,但在带有EFS的ECS上运行不正常。直接在您的计算机上装载EFS,检查根文件夹的权限
/
,这是您应该做的第一件事,请随时发布返回结果
drwxr-xr-x 3 root root 6144 Feb 3 00:50。
是对根文件夹的权限。这可能就是容器中的根目录起作用的原因。我知道在生成过程中创建的新用户没有访问EFS的权限。我如何在EFS上创建新用户而不装载到它?@boyfromnorth更新我的回答谢谢!我成功了。我必须在EFS上创建一个访问点,UID和GID与我在容器中创建的新用户相匹配。
FROM ubuntu:20.04

# Fetch values from ARGs that were declared at the top of this file
ARG APP_NAME
ARG APP_ARTIFACT_DIR
ARG APP_HOME_DIR="/app"
ARG APP_USER_NAME="appuser"
ARG APP_GROUP_ID="appgroup"

# Define workdir
ENV HOME="${APP_HOME_DIR}"
WORKDIR "${HOME}"

RUN apt-get update -y && apt-get install tree

# Define env vars
ENV PATH="${HOME}/.local/bin:${PATH}"

# Run as a non-root user
RUN addgroup "${APP_GROUP_ID}" && \
    useradd "${APP_USER_NAME}" --gid "${APP_GROUP_ID}" --home-dir "${HOME}" && \
    chown -R ${APP_USER_NAME} .

RUN mkdir -p rootdir && \
    mkdir -p rootdir/subdir && \
    touch rootdir/root.file rootdir/subdir/sub.file  && \
    chown -R root:root rootdir && \
    chmod 600 rootdir rootdir/root.file && \
    chmod -R 775 rootdir/subdir