【问题标题】:Docker - parent image execution fails due to missing root accessDocker - 由于缺少 root 访问权限,父映像执行失败
【发布时间】:2019-06-21 00:30:15
【问题描述】:

我使用的父图像似乎需要 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 在运行时执行,但它仍然不能解释整个图片和构建序列,否则我需要做什么就很清楚了。

【问题讨论】:

  • 您需要设置自己的 ENTRYPOINT 来覆盖父项。
  • 那它不会跳过父母 ENTRYPOINT 吗? Only the last ENTRYPOINT instruction in the Dockerfile will have an effect.docs.docker.com/engine/reference/builder/#entrypoint
  • 是的。您不能添加自己的命令来运行,docker 只启动一个进程。如果父母入口点做了一些重要的事情,您可能需要在启动脚本中自己设置所有内容。
  • 所以我不能有一个容器,如果 apache http 是父图像,我可以说 apache http 和我自己的服务运行?现在我想到了,这可能是容器化的重点。你知道任何解释构建/执行过程的好文档吗?究竟什么时候调用父入口点?执行顺序是什么等
  • Docker 启动 1 个进程,但该进程可能是进程管理器,即 supervisord,它本身启动 n 个进程,参考。 docs.docker.com/config/containers/multi-service_container - 我不同意@tkausl。

标签: docker dockerfile


【解决方案1】:

您应该在该图像中创建一个用户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
/ $

如您所见,用户nir 成功执行了脚本start.sh。在这里,我们刚刚使用adduser 为基于高山的图像创建了适当的用户(或为非高山图像使用 useradd)。使用chownchmod 为脚本授予适当的权限。

希望这有帮助,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多