Docker 构建中的权限被拒绝

pra*_*ant 9 docker dockerfile

我有以下 docker 文件

FROM something.com/..../lrh7:latest
RUN whoami
SHELL ["/usr/sbin", "-c"]
RUN /usr/sbin/groupadd -g 1000 AB_DOCKER_SETUP_GROUP
Run Code Online (Sandbox Code Playgroud)

当我进行 docker 构建时,它失败并提示权限被拒绝

container_linux.go:247: starting container process caused "exec: \"/usr/sbin\": permission denied"
Run Code Online (Sandbox Code Playgroud)

但当我改变时

RUN /usr/sbin/groupadd -g 1000 AB_DOCKER_SETUP_GROUP
Run Code Online (Sandbox Code Playgroud)

CMD ["su", "-" ,"groupadd", "-g", "1000", "AB_DOCKER_SETUP_GRO"]
Run Code Online (Sandbox Code Playgroud)

然后docker构建成功。whoami 的输出是 ROOT,这意味着我正在以 root 身份运行,即使在那之后我也必须显式指定 sudo 来添加组。

跑步

RUN su - /usr/sbin/groupadd -g 1000 AB_DOCKER_SETUP_GROUP # sudo/su both fails
Run Code Online (Sandbox Code Playgroud)

也因权限被拒绝而失败。我不清楚幕后发生了什么。

Tou*_*aza 18

对我来说,这是缺少 Docker 权限的问题

我使用以下命令修复了该问题。

sudo chmod -R g+rw "$HOME/.docker"
Run Code Online (Sandbox Code Playgroud)

仅供参考:我使用的是 Mac M1 机器。


Cha*_*lie 2

SHELL 命令的作用是在容器中为 shell 模式执行设置默认 shell。您在脚本中设置错误。随后的 RUN 命令是在 shell 模式下完成的,它会触发您指定的错误默认 shell 的问题。

另外,您应该通过符号链接引用您的 shell,而不是尝试在sbin系统目录中指定它。这/bin/sh -c是 Linux 的默认 shell - 因此,您不必显式设置它。

您工作的原因CMD []是它是在命令模式下执行的 - 因此,它不会尝试使用您指定的错误的默认 shell。

以下脚本足以满足您的用例:

FROM something.com/..../lrh7:latest
RUN whoami
RUN groupadd -g 1000 AB_DOCKER_SETUP_GROUP
Run Code Online (Sandbox Code Playgroud)

或者,如果您仍然想指定相同的默认 shell:

FROM something.com/..../lrh7:latest
RUN whoami
SHELL ["/bin/sh", "-c"]
RUN groupadd -g 1000 AB_DOCKER_SETUP_GROUP
Run Code Online (Sandbox Code Playgroud)

运行命令的另一种方式是作为可执行文件。当您的图像中没有 shell 时,这会很有帮助。

RUN ["groupadd", "-g", "1000", "AB_DOCKER_SETUP_GROUP"]
Run Code Online (Sandbox Code Playgroud)