无法在docker容器内创建目录。权限被拒绝。

95

在添加到sudoers组的非root用户构建镜像期间无法创建文件夹。这是我的Dockerfile:

FROM ubuntu:16.04

RUN apt-get update && \
    apt-get -y install sudo

RUN adduser --disabled-password --gecos '' newuser \
    && adduser newuser sudo \
    && echo '%sudo ALL=(ALL:ALL) ALL' >> /etc/sudoers

USER newuser

RUN mkdir -p /newfolder
WORKDIR /newfolder

我遇到了错误:mkdir: 无法创建目录 '/newfolder':权限被拒绝
4个回答

88

在 Docker 容器内部,文件系统的工作方式与容器外部的文件系统一样:如果要创建文件或目录,则需要适当的权限。在这种情况下,您正在尝试以非 root 用户(因为 USER 指令更改了用于运行其后任何命令的 UID)的身份创建 /newfolder。这是行不通的,因为 / 的所有者是 root,拥有模式 dr-xr-xr-x

请尝试使用以下方法:

RUN mkdir -p /newfolder
RUN chown newuser /newfolder
USER newuser
WORKDIR /newfolder

这将作为root创建目录,然后进行chown


1
很有帮助,谢谢。但是当我进入容器时:docker exec -it img /bin/bash,然后执行mkdir newfolder2命令时,会提示权限被拒绝,并要求使用'sudo'命令。是否可能在容器内部执行命令而不需要'sudo'? - Vadim Kovrizhkin
2
你使用了USER指令,所以当你在容器内运行命令时,你不是root用户。如果你想成为root用户,你需要一个特权升级工具,比如sudo或者su,或者重新设计容器,不使用USER指令,考虑使用类似ENTRYPOINT脚本的东西,在运行你的CMD时使用sudo或类似的工具来降低权限。 - larsks

22

这是一个对我有效的过程,用于创建具有非用户权限的文件夹

FROM solr:8
USER root
RUN mkdir /searchVolume
RUN chown solr:solr /searchVolume
USER solr

最后一行将登录用户切换回solr(或任何您指定的其他用户)。


-1

我在创建了[root]用户并完成xyz后遇到了这个问题。即使强制重新创建,当我试图重新构建我的docker时,它也会给我各种权限被拒绝的错误。对我来说安全性不是问题,所以只需添加

FROM ubuntu:latest

USER root

ENV TZ=Europe/Kiev
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN apt-get update && apt-get install...

然后执行我的新用户代码

RUN useradd...

我知道这不是完美的答案,但我希望能有所帮助!


-5

对我有用的是在Docker容器所在的目录上运行chmod 777。由于您的新容器是一个新用户,它没有权限在本地机器上创建子目录,因此chmod 777赋予了该权限。


8
使用 chmod 777 很容易引起安全问题。 - Joe Todd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接