权限被拒绝,mkdir 在 openshift 的容器中
permission denied, mkdir in container on openshift
我有一个包含 nodejs 和 pm2 作为启动命令的容器,在 OpenShift 上我在启动时收到此错误:
Error: EACCES: permission denied, mkdir '/.pm2'
我在 Marathon 主机上尝试了相同的图像,效果很好。
我需要更改 UserId 的内容吗?
Dockerfile:
FROM node:7.4-alpine
RUN npm install --global yarn pm2
RUN mkdir /src
COPY . /src
WORKDIR /src
RUN yarn install --production
EXPOSE 8100
CMD ["pm2-docker", "start", "--auto-exit", "--env", "production", "process.yml"]
更新
节点映像已经创建了一个 UID 为 1000 的新用户 "node" 而不是 运行 根映像。
我还尝试修复权限并将用户 "node" 添加到根组。
此外,我告诉 pm2 它应该与 ENV var 一起使用哪个目录:
PM2_HOME=/home/node/app/.pm2
但我仍然得到错误:
Error: EACCES: permission denied, mkdir '/home/node/app/.pm2'
更新的 Dockerfile:
FROM node:7.4-alpine
RUN npm install --global yarn pm2
RUN adduser node root
COPY . /home/node/app
WORKDIR /home/node/app
RUN chmod -R 755 /home/node/app
RUN chown -R node:node /home/node/app
RUN yarn install --production
EXPOSE 8100
USER 1000
CMD ["pm2-docker", "start", "--auto-exit", "--env", "production", "process.yml"]
更新2
感谢 Graham Dumpleton 我让它工作了
FROM node:7.4-alpine
RUN npm install --global yarn pm2
RUN adduser node root
COPY . /home/node/app
WORKDIR /home/node/app
RUN yarn install --production
RUN chmod -R 775 /home/node/app
RUN chown -R node:root /home/node/app
EXPOSE 8100
USER 1000
CMD ["pm2-docker", "start", "--auto-exit", "--env", "production", "process.yml"]
OpenShift 默认将 运行 容器作为非 root 用户。因此,如果您的应用程序需要 运行s 作为根用户,它可能会失败。是否可以将容器配置为 运行 作为 root 将取决于您在集群中拥有的权限。
最好设计您的容器和应用程序,这样它就不必 运行 作为 root。
几点建议。
为应用程序创建一个特殊的 UNIX 用户 运行 并在 Dockerfile
的 USER 语句中设置该用户(使用其 uid)。将用户组设为根组。
修复特殊用户拥有的 /src
目录及其下所有内容的权限。确保一切都是组根。确保任何需要可写的内容都可写到组 root。
确保在 Dockerfile
中将 HOME
设置为 /src
。
完成后,当 OpenShift 运行 将您的容器作为分配的 uid,其中组为 root,然后由于一切都是组可写的,应用程序仍然可以更新 /src
下的文件。设置的 HOME
变量确保通过代码写入主目录的任何内容都进入可写 /src
区域。
您使用的是哪种 openshift?
您可以编辑 "restricted" 安全上下文约束:
来自 openshift CLI:
oc edit scc restricted
并更改:
runAsUser:
type: RunAsUSer
到
runAsUser:
type: RunAsAny
请注意,Graham Dumpleton 的回答是正确的
您还可以 运行 下面的命令授予对您登录的项目的 root 访问权限:
oc adm policy add-scc-to-user anyuid -z default
Graham Dumpleton 的解决方案有效但不推荐。
Openshift,将在 运行 个容器时使用随机 UID。
您可以在 Pod 生成的 Yaml 中看到。
spec:
- resources:
securityContext:
runAsUser: 1005120000
您应该应用 Docker 安全最佳实践来编写您的 Docker 文件。
不要将您的应用程序的执行绑定到特定的 UID:使资源世界可读(即 0644 而不是 0640)并在需要时可执行。
使可执行文件归 root 所有且不可写
有关推荐的完整列表,请参阅:https://sysdig.com/blog/dockerfile-best-practices/
在你的情况下,没有必要:
RUN adduser node root
...
RUN chown -R node:node /home/node/app
USER 1000
在原问题中,应用程序文件已归 root 所有。
以下 chmod 足以使它们对世界可读和可执行。
RUN chmod -R 775 /home/node/app
我有一个包含 nodejs 和 pm2 作为启动命令的容器,在 OpenShift 上我在启动时收到此错误:
Error: EACCES: permission denied, mkdir '/.pm2'
我在 Marathon 主机上尝试了相同的图像,效果很好。
我需要更改 UserId 的内容吗?
Dockerfile:
FROM node:7.4-alpine
RUN npm install --global yarn pm2
RUN mkdir /src
COPY . /src
WORKDIR /src
RUN yarn install --production
EXPOSE 8100
CMD ["pm2-docker", "start", "--auto-exit", "--env", "production", "process.yml"]
更新
节点映像已经创建了一个 UID 为 1000 的新用户 "node" 而不是 运行 根映像。
我还尝试修复权限并将用户 "node" 添加到根组。
此外,我告诉 pm2 它应该与 ENV var 一起使用哪个目录:
PM2_HOME=/home/node/app/.pm2
但我仍然得到错误:
Error: EACCES: permission denied, mkdir '/home/node/app/.pm2'
更新的 Dockerfile:
FROM node:7.4-alpine
RUN npm install --global yarn pm2
RUN adduser node root
COPY . /home/node/app
WORKDIR /home/node/app
RUN chmod -R 755 /home/node/app
RUN chown -R node:node /home/node/app
RUN yarn install --production
EXPOSE 8100
USER 1000
CMD ["pm2-docker", "start", "--auto-exit", "--env", "production", "process.yml"]
更新2 感谢 Graham Dumpleton 我让它工作了
FROM node:7.4-alpine
RUN npm install --global yarn pm2
RUN adduser node root
COPY . /home/node/app
WORKDIR /home/node/app
RUN yarn install --production
RUN chmod -R 775 /home/node/app
RUN chown -R node:root /home/node/app
EXPOSE 8100
USER 1000
CMD ["pm2-docker", "start", "--auto-exit", "--env", "production", "process.yml"]
OpenShift 默认将 运行 容器作为非 root 用户。因此,如果您的应用程序需要 运行s 作为根用户,它可能会失败。是否可以将容器配置为 运行 作为 root 将取决于您在集群中拥有的权限。
最好设计您的容器和应用程序,这样它就不必 运行 作为 root。
几点建议。
为应用程序创建一个特殊的 UNIX 用户 运行 并在
Dockerfile
的 USER 语句中设置该用户(使用其 uid)。将用户组设为根组。修复特殊用户拥有的
/src
目录及其下所有内容的权限。确保一切都是组根。确保任何需要可写的内容都可写到组 root。确保在
Dockerfile
中将HOME
设置为/src
。
完成后,当 OpenShift 运行 将您的容器作为分配的 uid,其中组为 root,然后由于一切都是组可写的,应用程序仍然可以更新 /src
下的文件。设置的 HOME
变量确保通过代码写入主目录的任何内容都进入可写 /src
区域。
您使用的是哪种 openshift?
您可以编辑 "restricted" 安全上下文约束:
来自 openshift CLI:
oc edit scc restricted
并更改:
runAsUser:
type: RunAsUSer
到
runAsUser:
type: RunAsAny
请注意,Graham Dumpleton 的回答是正确的
您还可以 运行 下面的命令授予对您登录的项目的 root 访问权限:
oc adm policy add-scc-to-user anyuid -z default
Graham Dumpleton 的解决方案有效但不推荐。
Openshift,将在 运行 个容器时使用随机 UID。
您可以在 Pod 生成的 Yaml 中看到。
spec:
- resources:
securityContext:
runAsUser: 1005120000
您应该应用 Docker 安全最佳实践来编写您的 Docker 文件。
不要将您的应用程序的执行绑定到特定的 UID:使资源世界可读(即 0644 而不是 0640)并在需要时可执行。
使可执行文件归 root 所有且不可写
有关推荐的完整列表,请参阅:https://sysdig.com/blog/dockerfile-best-practices/
在你的情况下,没有必要:
RUN adduser node root
...
RUN chown -R node:node /home/node/app
USER 1000
在原问题中,应用程序文件已归 root 所有。
以下 chmod 足以使它们对世界可读和可执行。
RUN chmod -R 775 /home/node/app