【问题标题】:Docker starting cron service, but when opening terminal it is not running anymore?Docker启动cron服务,但是打开终端时它不再运行了?
【发布时间】:2019-11-16 02:18:12
【问题描述】:

我有一个简单的 Dockerfile 和 docker compose 设置来测试容器中的 cron。

作为最后一步,启动了 cron,我收到消息 cron has started,但是当我登录到容器并检查 cron 服务的状态时,它没有运行。这怎么可能?

我相信我误解了某些东西,但无法弄清楚它到底是什么。

Dockerfile:

FROM ubuntu:bionic

# Create the log file to be able to run tail
RUN touch /var/log/cron.log

# Install Cron
RUN apt-get update && apt-get install cron

# Install the crontab
COPY crontab /etc/cron.d/crontab

# Is this needed??
RUN touch /var/log/cron.log
RUN chmod 777 /var/log/cron.log

# Run the command on container startup
CMD service cron start && tail -f /var/log/cron.log

docker-compose.yml

version: '3'
services:

  cron:
    # build a custom image
    build:
      context: .
      dockerfile: Dockerfile

    # a name for easier reference
    image: cron

文件crontab有效,包含:

* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
# Don't remove the empty line at the end of this file. It is required.

然后开始:docker-compose up --build 输出是:

Creating network "docker-cron_default" with the default driver
Building cron
Step 1/8 : FROM ubuntu:bionic
 ---> 4c108a37151f
Step 2/8 : MAINTAINER wouter.samaey@storefront.be
 ---> Using cache
 ---> 0d9fa7049481
Step 3/8 : RUN touch /var/log/cron.log
 ---> Using cache
 ---> 39bb838fe945
Step 4/8 : RUN apt-get update && apt-get install cron
 ---> Using cache
 ---> d3ce6cc03821
Step 5/8 : COPY crontab /etc/cron.d/crontab
 ---> Using cache
 ---> fab99f2e2e77
Step 6/8 : RUN touch /var/log/cron.log
 ---> Using cache
 ---> c7fab49def98
Step 7/8 : RUN chmod 777 /var/log/cron.log
 ---> Using cache
 ---> 7dc00a5913bd
Step 8/8 : CMD service cron start && tail -f /var/log/cron.log
 ---> Running in a4bdec436613
Removing intermediate container a4bdec436613
 ---> 97c867e25091
Successfully built 97c867e25091
Successfully tagged cron:latest
Creating docker-cron_cron_1 ... done
Attaching to docker-cron_cron_1
cron_1  |  * Starting periodic command scheduler cron
cron_1  |    ...done.

但是当我在这个容器上打开 bash shell 时,cron 没有运行:

docker run -it cron /bin/bash

root@d6649b402133:/# /etc/init.d/cron status
 * cron is not running

这怎么可能?

【问题讨论】:

  • ps aux 在容器中为您提供了什么?我想知道您发出的命令是否仅用于服务,但 Cron 并未作为服务运行。
  • ps aux 仅显示 2 行。没有cron。很奇怪为什么只有2行...

标签: linux docker cron docker-compose


【解决方案1】:

一个 Docker 容器只运行一个进程。当你

docker run --rm -it imagename bash

shell 运行而不是 Dockerfile 中的CMD

典型的最佳实践是将要运行的东西作为前台进程运行。在您的示例中,如果存在某种导致 crond 崩溃的错误,您永远不会注意到,因为您的容器的主进程是“永远休眠”。相应地,在您展示的容器中获取交互式 shell 对于调试非常有用(“如果我的文件不在 /etc/cron.d 中,那么它实际上在哪里?”)但这并不是操作 Docker 的真正标准方式。

简而言之:我会将 Dockerfile 的最后一行更改为

CMD ["crond", "-n"]

使守护进程作为前台进程启动,而不必担心同时尝试获取 shell。

【讨论】:

  • 好地方大卫! Wouter,如果您切换到 docker exec,那么您应该会看到您的 Cron 进程正在运行。
  • ^ 您需要以docker run <image> -d 开头,以便将其作为容器启动,并将其置于后台。
  • 如何使用docker-compose 运行它(我想设置一组更复杂的容器,所以坚持使用docker-compose)。目前,我看不到 cron 是否正在运行,因为在前台运行 cron 时我看不到 /var/log/cron.log 的内容。有什么办法吗?同样对于 Ubuntu,命令是 cron -f,但这很好。
  • linux.die.net/man/8/crond 似乎记录了 Vixie cron(这是 -n 的来源)。
  • 由于CMD修改导致crond成为主容器进程,没有歧义:如果容器正在运行,那么cron正在运行。您还可以将卷挂载到容器中的/var/log,以便从主机读取日志文件。
猜你喜欢
  • 1970-01-01
  • 2019-10-02
  • 2021-03-19
  • 2021-12-30
  • 2016-08-23
  • 2017-11-18
  • 2016-09-07
  • 2016-01-23
  • 2016-02-16
相关资源
最近更新 更多