【问题标题】:Running root service in Dockerfile with non-root user使用非 root 用户在 Dockerfile 中运行 root 服务
【发布时间】:2021-02-15 08:19:29
【问题描述】:

我正在尝试制作一个非根容器并在容器内运行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 中运行?

【问题讨论】:

    标签: bash docker cron dockerfile root


    【解决方案1】:

    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 守护进程。它本身不会非常有用;如果您想使用有关您的目标的更多信息来更新您的问题,我很乐意扩展此答案。

    【讨论】:

    • 嗨@arsks,感谢您的回答。在您的示例中,容器将以 root 身份运行,这是我试图通过创建用户来解决的问题。但是问题是cron 服务没有运行。我想确保cron 服务以root 身份在容器中运行。但是容器没有以 root 身份运行。
    • “容器”和“容器中运行的单个进程”之间并没有真正的区别:如果 cron 守护进程需要以 root 身份运行,那么“容器”以 root 身份运行。
    猜你喜欢
    • 1970-01-01
    • 2017-04-30
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2011-09-28
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多