如何让crond在Docker容器中自动启动Alpine



我希望能够使用cron在一小时内在容器服务中运行一个简单的bash脚本。我通过docker-compose使用Alpine Linux和一个自定义的Dockerfile来生成一个基于php-fpm的映像,我希望crond也能在上面运行,但我做不到。

一旦构建完毕,对容器执行ps aux | grep cron,将不返回任何结果。

据我所知,Docker容器中不存在常见的Linux启动过程-很好-那么我如何自动启动crond?它在/etc/periodic/下的目录是自动创建的,所以我不明白为什么使用这些目录的适用进程没有运行。

我尝试在docker-compose.yml中创建一个专用的服务定义,它确实有效,但每小时运行一次的shell脚本需要访问在不同容器中运行的php二进制文件,所以这不是一个可行的解决方案。

如果我进入容器并运行rc-service crond start,我会得到这个——但它永远不会"完成":

/var/www/html # rc-service crond start
* WARNING: crond is already starting
#> docker --version
Docker version 19.03.8, build afacb8b7f0
#> docker-compose --version
docker-compose version 1.23.2, build 1110ad01

我需要一个可以放入Dockerfiledocker-compose.yml文件中的解决方案。

Dockerd正在Ubuntu Xenial FWIW上运行。

要运行cronjob容器(Alpine(,您需要确保docker容器的命令是

exec crond -f

如果您想将其添加到docker文件

CMD ["exec", "crond", "-f"]

在运行上述命令之前,您可能还需要更新玉米文件

基于docker文件进行更新并撰写

为了能够解决您的问题,您需要更新docker compose,使其具有两个容器,一个用于cron,另一个用于web

service_php_cron:
build:
context: .
dockerfile: .docker/services/php/Dockerfile.dev
container_name: base_service_php
command: 'cron_jobs'
volumes:
- ./app:/var/www/html/public
env_file:
- ./.env
# Low level container logging
logging:
driver: "json-file"
options:
max-size: "1m"
max-file: "5"
service_php:
build:
context: .
dockerfile: .docker/services/php/Dockerfile.dev
ports:
- "9000:9000"
command: 'web_server'
container_name: base_service_php
volumes:
- ./app:/var/www/html/public
env_file:
- ./.env
# Low level container logging
logging:
driver: "json-file"
options:
max-size: "1m"
max-file: "5"

您还需要更新您的docker文件,以便能够使用docker入口点处理多个命令

将下面的行添加到你的docker文件+删除CMD一个

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

最后,创建入口点(确保其散列执行权限(

#!/bin/sh -e
case $1 in
web_server)
YOUR WEB SERVER COMMAND 
;;
cron_jobs)
exec crond -f
;;
*)
exec "$@"
;;
esac
exit 0

您可以查看此链接以了解有关入口点的更多信息

最新更新