如何在后台安排作业并在 docker 容器内启动另一个进程?

How to schedule a job in the background and start another process inside a docker container?

我的问题与其他问题非常接近,例如 and this one 使用 croninfinite loop 在 docker 中安排单个 job/process容器。

这两种方法都适合我,但我的问题有点不同:我想

  1. 在后台安排一个job/process
  2. 然后开始另一个进程。

在我的现实世界问题中:

  1. 是一个ETL process
  2. 是一个 Django instance(网络服务器)。

我怎样才能以干净的方式做到这一点?

欢迎任何提示!

我根据以下 article.

使用 docker-compose 找到了解决方案

它基本上覆盖了 docker-compose.yml 文件中另一个服务中的入口点:

version: "3"

services:
  app:
    image: demo-image:latest
    volumes:
      - data:/app-data
  cron:
    image: demo-image:latest
    command: [ "cron -f" ]
    tty: true
    volumes:
      - data:/app-data

volumes:
  data:

我的例子Dockerfile:

# syntax=docker/dockerfile:experimental
FROM python:3.9

RUN apt-get update
RUN apt-get -y install cron
COPY my-crontab /etc/cron.d/my-crontab
RUN chmod 0744 /etc/cron.d/my-crontab
RUN crontab -l | { cat; cat /etc/cron.d/my-crontab } | crontab -
RUN touch /var/log/cron.log
WORKDIR /code
COPY . /code
ENTRYPOINT ["/bin/bash", "/docker-entrypoint.sh"]

我的示例 cronjob 文件中有一个重要提示,我花了好几个小时来跟踪错误:

* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
# must be ended with a new line "LF" (Unix) and not "CRLF" (Windows)

我发现这个解决方案更简洁,因为它每个容器只使用一个进程。