我有以下docker文件
FROM something.com/..../lrh7:latest
RUN whoami
SHELL ["/usr/sbin", "-c"]
RUN /usr/sbin/groupadd -g 1000 AB_DOCKER_SETUP_GROUP
当我执行docker build时,它失败,说明权限被拒绝
container_linux.go:247: starting container process caused "exec: \"/usr/sbin\": permission denied"
但是当我改变
RUN /usr/sbin/groupadd -g 1000 AB_DOCKER_SETUP_GROUP
到
CMD ["su", "-" ,"groupadd", "-g", "1000", "AB_DOCKER_SETUP_GRO"]
然后docker构建成功。 whoami的输出是ROOT,这意味着我正在以root用户身份运行,即使在那之后我必须显式指定sudo来添加组。
运行
RUN su - /usr/sbin/groupadd -g 1000 AB_DOCKER_SETUP_GROUP # sudo/su both fails
也失败,权限被拒绝。我不清楚幕后发生了什么。
答案 0 :(得分:0)
SHELL命令的作用是在容器中为执行shell模式设置默认的shell。您在脚本中设置了错误。随后的RUN命令是在Shell模式下完成的,它会触发您指定的默认Shell错误的问题。
此外,您应该通过符号链接来引用外壳程序,而不是尝试在sbin
系统目录中指定它。 /bin/sh -c
是Linux的默认外壳程序-因此,您不必显式设置它。
CMD []
工作的原因是它是在命令模式下执行的-因此,它不会尝试使用您指定的错误默认外壳程序。
在您的用例中,以下脚本就足够了:
FROM something.com/..../lrh7:latest
RUN whoami
RUN groupadd -g 1000 AB_DOCKER_SETUP_GROUP
或者,如果您仍然想指定相同的默认外壳:
FROM something.com/..../lrh7:latest
RUN whoami
SHELL ["/bin/sh", "-c"]
RUN groupadd -g 1000 AB_DOCKER_SETUP_GROUP
另一种运行命令的方法是作为可执行文件。当您的图像中没有外壳时,这会很有帮助。
RUN ["groupadd", "-g", "1000", "AB_DOCKER_SETUP_GROUP"]