gpt4 book ai didi

docker - 在 docker-entrypoint.sh 文件内的后台运行 cron 作业

转载 作者:行者123 更新时间:2023-12-05 06:00:04 25 4
gpt4 key购买 nike

我想运行一个启动器脚本和一个 cron 作业来运行一个更新程序脚本,它们都在一个连接到 mongo 数据库的 Docker 容器中。有人可以帮助我如何在 docker-entrypoint.sh 文件中的后台运行 cron 作业吗?

我的 docker-entrypoint.sh 看起来像这样:

#!/usr/bin/env bash

set -m

cron & (
source /venv/bin/activate
python3 /code/FBInitializer.py
)

我的 Dockerfile 如下所示:

FROM python:3.8.6-slim

RUN apt-get update && apt-get -y install python3 cron vim
RUN pip3 install --upgrade pip

COPY . /code
WORKDIR /code
COPY requirements.txt .

RUN python3 -m venv /venv
RUN . /venv/bin/activate && pip3 install -r requirements.txt

ADD crontab /etc/cron.d/
ADD FBInitializer.py /code
ADD FBUpdater.py /code

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

RUN chmod 0644 crontab
# RUN chmod 777 ./venv/lib/python3.8/site-packages
# RUN chmod 755 ./venv/bin/activate

#RUN crontab crontab
#CMD ["cron"]

COPY /docker-entrypoint.sh /docker-entrypoint.sh
RUN ["chmod", "+x", "/docker-entrypoint.sh"]
ENTRYPOINT ["/docker-entrypoint.sh"]

EXPOSE 6000
COPY . .

启动器脚本运行,但容器停止工作并出现以下错误:

exited with code 0

有什么想法吗?

最佳答案

您通常希望每个容器只运行一个进程。这意味着在一个容器中运行主 Python 应用程序,在第二个容器中运行 cron 守护进程。覆盖图像的 CMD 更直接,因为这是一个常规用例,对于大多数用途,我通常更喜欢 CMD 而不是 ENTRYPOINT

在这个 Dockerfile 中:

  • 删除 Python 虚拟环境。 Docker 镜像已经提供了与其他 Python 和应用程序的隔离。
    # Outright delete this line:
    # RUN python3 -m venv /venv

    # Doesn't need a virtual environment, just the "system" Python:
    RUN pip3 install -r requirements.txt
  • 删除docker-entrypoint.sh 脚本。相反,将容器的 CMD 设置为运行 Python 脚本。由于我们已经删除了虚拟环境,您可以按原样运行脚本。
    # Delete:
    # COPY /docker-entrypoint.sh /docker-entrypoint.sh
    # RUN ["chmod", "+x", "/docker-entrypoint.sh"]
    # ENTRYPOINT ["/docker-entrypoint.sh"]

    # Instead:
    CMD ["/code/FBInitializer.py"]
    # (That script should be executable, and begin with the usual
    # #!/usr/bin/env python3
    # shebang line)
  • 正常运行该容器;它不会启动 cron 作业。
    docker build -t my-image .
    docker run --name app-server -d -p 6000:6000 my-image
  • 运行第二个容器,关闭相同的图像,但用 cron 守护进程替换它的命令。
    docker run --name app-cron -d my-image \
    cron -f
    # (look up the right cron(8) option to not demonize)

关于docker - 在 docker-entrypoint.sh 文件内的后台运行 cron 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67872326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com