问下我这个用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
然后我想问下,我那个定时任务应该装到那个容器呢,还是需要怎么操作呢?
我是启动容器的时候触发一个shell脚本 这个shell脚本是将定时任务的命令写入到crontab 然后启动crontab
这让我想到了1Panel,在1Paneld的作业计划中执行的命令是
docker exec -w /www/sites/xxx.xxx.xx/index -u 1000:1000 1Panel-php8-LO7z php artisan schedule:run
参考下
laradock
的php-worker
github.com/laradock/laradock/blob/...
里面有
php artisan queue:work
和php artisan schedule:run
我是放在宿主机上去调用
除此之外我还在项目中写了个定时任务判断,如果是容器刚启动,我会判断我的octane服务是否启动
如果你是自己编写针对某个项目,我觉得你可以直接写道Dockerfile里就行了,上面额外写只是偷懒而已
我也来个骚操作, 在docker里面调用宿主机的docker
开发环境的话怎么做都行,如果是生产环境的话,建议给 crontab 专门启动一个容器,将
crond -f
作为容器启动脚本(PID=1)。这样如果配置好即便容器启动进程挂掉的也会被 docker 重新拉起来。当然这个容器要具备与fpm
相同软件环境的景象,简单搞的话可以直接用fpm
镜像来运行crond
。