我正在使用的父映像似乎需要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
命令是在构建时使用的,而CMD
和ENTRYPOINT
是在运行时执行的,但它仍然不能解释整个构建过程的画面和顺序,否则我会很清楚去做。
答案 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)。使用chown
和chmod
获得对脚本的适当许可。
希望这会有所帮助,让我知道。