如何在后台安排作业并在 docker 容器内启动另一个进程?
How to schedule a job in the background and start another process inside a docker container?
我的问题与其他问题非常接近,例如 and this one 使用 cron
或 infinite loop
在 docker 中安排单个 job/process容器。
这两种方法都适合我,但我的问题有点不同:我想
- 在后台安排一个job/process
- 然后开始另一个进程。
在我的现实世界问题中:
- 是一个
ETL process
和
- 是一个
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)
我发现这个解决方案更简洁,因为它每个容器只使用一个进程。
我的问题与其他问题非常接近,例如 cron
或 infinite loop
在 docker 中安排单个 job/process容器。
这两种方法都适合我,但我的问题有点不同:我想
- 在后台安排一个job/process
- 然后开始另一个进程。
在我的现实世界问题中:
- 是一个
ETL process
和 - 是一个
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)
我发现这个解决方案更简洁,因为它每个容器只使用一个进程。