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 在我的本地计算机上运行良好。
阅读此博文 -将 Amazon EFS 与 Amazon ECS 和 AWS Fargate \xe2\x80\x93 结合使用的开发人员指南第 2 部分 > POSIX 权限
\n可能与分配给 ECS 任务的 IAM 角色的 IAM 策略相关。
\n\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
确保您的 root-dir 权限设置为777
. 这样任何 UID 都可以读/写这个目录。
为了不那么宽松,请将 root-dir 设置755
为默认设置,请参阅文档。这提供read-write-execute
给 root 用户、read-execute
组和read-execute
所有其他用户。
如果没有对其父目录(目录)的读取访问权限,则用户(UID)无法访问(读取)子目录。
\n您可以使用Docker轻松测试它,这是一个简单的示例
\n创建一个Dockerfile -
\nFROM 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 600
和chmod -R 775
,尝试不同的权限集,例如777
和644
,并看看它是否有意义。
构建镜像、运行容器并测试权限 -
\nFROM 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
归档时间: |
|
查看次数: |
15902 次 |
最近记录: |