使用非root用户在Dockerfile中运行root服务

时间:2020-11-02 16:37:11

标签: bash docker cron dockerfile root

我正在尝试制作一个非根容器,并在该容器中运行一个cron任务。但是,我遇到的问题是确保服务cron在安装后运行。

Dockerfile看起来像这样:

FROM ubuntu:20.04
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
    apt-get install -y bash nano cron 
RUN adduser --disabled-password -gecos '' -u 1551 face
RUN service cron start
USER 1551

运行容器并以交互方式访问它之后,服务cron未运行:

face@9eb7bacb90ca:/$ service cron status
 * cron is not running

如何确保cron服务在Dockerfile中运行?

1 个答案:

答案 0 :(得分:4)

RUN指令在映像构建过程中执行命令。

您的RUN service cron start命令没有做任何有用的事情。即使它成功启动了cron服务,一旦您的映像构建完成,整个构建环境也会消失。

如果要使进程在从映像开始的容器中运行,则必须安排通过适当的CMDENTRYPOINT声明来启动该服务,该声明设置了在容器中运行的命令开始。

例如,如下所示:

FROM ubuntu:20.04
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
    apt-get install -y cron
CMD ["cron", "-f"]

您会注意到,由于该示例中adduser不会以非特权用户身份运行,因此我从此示例中删除了USER命令(和cron指令)。

如果从该映像启动容器,它将运行cron守护程序。它本身并不会非常有用。如果您想使用有关您的目标的更多信息来更新您的问题,我很乐意扩展此答案。