Docker-由于缺少根访问权限,父映像执行失败

时间:2019-06-21 00:30:15

标签: docker dockerfile

我正在使用的父映像似乎需要root访问权限才能运行其ENTRYPOINT指令。

在我的Dockerfile中,我需要在最后由普通用户运行自己的容器(可执行文件)。如何在此处的用户之间来回切换?

伪Dockerfile:

FROM parentrepo/parentimg # its Dockerfile probably has ENTRYPOINT at the end which requires root access
#my app specific instructions
WORKDIR ..
RUN mkdir ..
COPY ..
RUN tar ..
EXPOSE 9000
USER nir # HEre i want to switch user to nir
WORKDIR ${myhome}
CMD ["/bin/bash", "-c", "./start"]

由于父级需要sudo访问,因此以上运行失败。如果我不执行USER nir,则我的进程将以我不需要的root用户身份启动。父Dockerfile是否需要在此处具有USER root

此外,是否有任何文档描述docker Build如何在高层执行指令? 。它如何与父Dockerfile的层次结构交互。看起来它从父docker文件中导入了指令;创建一个docker文件。反正它会重新排序指令吗?

在运行时通过docker run执行会发生什么?我知道RUN命令是在构建时使用的,而CMDENTRYPOINT是在运行时执行的,但它仍然不能解释整个构建过程的画面和顺序,否则我会很清楚去做。

1 个答案:

答案 0 :(得分:0)

您应在该图像内创建一个用户nir,并赋予适当的所有权和权利以执行该./start脚本。

这是我尝试过的方法,并且有效。

  • 创建了一个包含以下内容的Dockerfile
FROM alpine
WORKDIR /
#RUN useradd -ms /bin/bash nir <= (This will work for non-alpine images)
RUN addgroup -S appgroup && adduser -S nir -G appgroup
COPY . /
RUN chown nir:appgroup /start.sh
RUN chmod +x /start.sh
USER nir
CMD ["/bin/sh", "-c", "/start.sh"]
  • start.sh脚本的内容。
#!/bin/sh
echo "hello" > /tmp/abc.txt
sleep 100
exec "$@"
  • 构建并运行容器。
$ docker run -itd  t:t .
$ docker run -itd  t:t
$ docker exec -it de11dbffb2ca sh
/ $ ls /tmp/abc.txt
/tmp/abc.txt
/ $ cat /tmp/abc.txt
hello
/ $ ls -ltrh /tmp/
total 4K
-rw-r--r--    1 nir      appgroup       6 Jun 21 04:35 abc.txt
/ $

如您所见,脚本start.sh已由用户nir成功执行。在这里,我们仅针对基于高山的图像使用adduser创建了适当的用户(或针对非高山图像使用了useradd)。使用chownchmod获得对脚本的适当许可。

希望这会有所帮助,让我知道。