问下我这个用docker-compose创建的多个容器,如何能执行定时任务?

我的docker-compose.yml文件如下

version: '1.0'
services:
  mysql:
    image: mysql:5.7.40
    restart: always
    container_name: mysql
    networks:
      net:
        ipv4_address: 172.18.0.14    
    volumes:
      - /home/www/wwwdata/mysql:/var/lib/mysql
      - /home/www/wwwlogs/mysql:/var/log/mysql
    environment:
      MYSQL_ROOT_PASSWORD: hqSM@ZSdUTH
      MYSQL_DATABASE: fss
      MYSQL_USER: fss
      MYSQL_PASSWORD: fpTfS@x7p9
  redis:
    image: redis:7.2.0-alpine
    restart: always
    container_name: redis
    command: redis-server --requirepass 2VVHXy!LV*Bj
    networks:
      net:
        ipv4_address: 172.18.0.15
    volumes:
      - /home/www/wwwdata/redis:/etc/redis 
  php74:
    image: registry.cn-hangzhou.aliyuncs.com/cqcqs/php74-fpm
    container_name: php74
    restart: always
    ports:
      - 9000:9000
    links:
      - mysql
      - redis      
    volumes:
      - /home/www/wwwroot:/home/www
      - /home/www/wwwlogs/php:/var/log
    networks:
      net:
        ipv4_address: 172.18.0.12
  nginx:
    image: nginx
    container_name: nginx
    restart: always
    ports:
      - 80:80
    volumes:
      - /home/www/wwwconf/nginx:/etc/nginx/conf.d
      - /home/www/wwwroot:/home/www
      - /home/www/wwwlogs/nginx:/var/log/nginx
    working_dir: /var/www/html
    links:
      - php74
    networks:
      net:
        ipv4_address: 172.18.0.13  
networks:
  net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.18.0.0/24

然后我想问下,我那个定时任务应该装到那个容器呢,还是需要怎么操作呢?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 10

我是启动容器的时候触发一个shell脚本 这个shell脚本是将定时任务的命令写入到crontab 然后启动crontab

6个月前 评论
donggan (楼主) 6个月前
cccyzloong (作者) 6个月前
donggan (楼主) 6个月前
cccyzloong (作者) 6个月前

这让我想到了1Panel,在1Paneld的作业计划中执行的命令是docker exec -w /www/sites/xxx.xxx.xx/index -u 1000:1000 1Panel-php8-LO7z php artisan schedule:run

6个月前 评论

参考下 laradockphp-worker

github.com/laradock/laradock/blob/...

里面有 php artisan queue:workphp artisan schedule:run

6个月前 评论

我是放在宿主机上去调用

* * * * * cd /home/wwwsite/dnmp && /usr/local/bin/docker-compose exec -u www-data:www-data php  /usr/local/bin/php /www/project/artisan schedule:run >> /dev/null 2>&1

除此之外我还在项目中写了个定时任务判断,如果是容器刚启动,我会判断我的octane服务是否启动

如果你是自己编写针对某个项目,我觉得你可以直接写道Dockerfile里就行了,上面额外写只是偷懒而已

6个月前 评论

我也来个骚操作, 在docker里面调用宿主机的docker

    crontabs:
    build: ./crontabs
    restart: always
    container_name: "crontabs"
    privileged: true
    working_dir: "${PWD}"
    tty: true
    volumes:
      - "${PWD}:${PWD}"
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "${PWD}/crontabs/root:/etc/crontabs/root"
      - "${PWD}/crontabssh/:/crontabssh"
    command: crond -f -c /etc/crontabs/

crontabs 的dockerfile

FROM busybox
COPY --from=docker:24.0.9-cli /usr/local/bin/docker /usr/local/bin/docker
COPY --from=docker:24.0.9-cli /usr/local/bin/docker-compose /usr/local/bin/docker-compose
CMD ["sh", "-c", "busybox crond -f -c /etc/crontabs/"]

/etc/crontabs/root 文件, 在.sh脚本里面就可以调用宿主机的docker了

# min   hour    day     month   weekday command
10      4       *       *       *         /crontabssh/*.sh 2>&1 &
6个月前 评论
sanders

开发环境的话怎么做都行,如果是生产环境的话,建议给 crontab 专门启动一个容器,将 crond -f 作为容器启动脚本(PID=1)。这样如果配置好即便容器启动进程挂掉的也会被 docker 重新拉起来。当然这个容器要具备与 fpm 相同软件环境的景象,简单搞的话可以直接用 fpm 镜像来运行 crond

6个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!