[英]Config Dockerfile for running cronjob
我是 Docker 的新手,我的自定义 Dockerfile 遇到问题,需要你们的帮助。 在我添加一些代码来运行 docker 容器中的 cronjob 之前,它工作正常。
这是我的 Dockerfile 文件:
FROM php:7.2-fpm-alpine
COPY cronjobs /etc/crontabs/root
// old commands
ENTRYPOINT ["crond", "-f", "-d", "8"]
这是cronjobs
文件:
* * * * * cd /var/www/html && php artisan schedule:run >> /dev/null 2>&1
这是docker-compose.yml
文件:
version: '3'
networks:
laravel:
services:
nginx:
image: nginx:stable-alpine
container_name: nginx_ctrade
ports:
- "8081:80"
volumes:
- ./app:/var/www/html
- ./config/nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./config/certs:/etc/nginx/certs
- ./log/nginx:/var/log/nginx
depends_on:
- php
- mysql
networks:
- laravel
working_dir: /var/www/html
php:
build:
context: ./build
dockerfile: php.dockerfile
container_name: php_ctrade
volumes:
- ./app:/var/www/html
- ./config/php/php.ini:/usr/local/etc/php/php.ini
networks:
- laravel
mysql:
image: mysql:latest
container_name: mysql_ctrade
tty: true
volumes:
- ./data:/var/lib/mysql
- ./config/mysql/my.cnf:/etc/mysql/my.cnf
environment:
- MYSQL_ROOT_PASSWORD=secret
- MYSQL_USER=admin
- MYSQL_DATABASE=laravel
- MYSQL_PASSWORD=secret
networks:
- laravel
我重新构建 docker 映像并运行它。 cronjob 工作正常,但是当我在localhost:8081
访问本地主机时。 它不再工作了。 该页面显示502 Bad Gateway
,因此我检查了 Nginx 错误日志。 这是显示给我的 Nginx 错误:
2020/04/10 13:33:36 [error] 8#8: *28 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.224.1, server: localhost, request: "GET /trades HTTP/1.1", upstream: "fastcgi://192.168.224.3:9000", host: "localhost:8081", referrer: "http://localhost:8081/home"
更新后所有容器仍在运行。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a2403ece8509 nginx:stable-alpine "nginx -g 'daemon of…" 18 seconds ago Up 17 seconds 0.0.0.0:8081->80/tcp nginx_ctrade
69032097b7e4 ctrade_php "docker-php-entrypoi…" 19 seconds ago Up 18 seconds 9000/tcp php_ctrade
592b483305d5 mysql:latest "docker-entrypoint.s…" 3 hours ago Up 18 seconds 3306/tcp, 33060/tcp mysql_ctrade
以前有人遇到过这个问题吗? 任何帮助,将不胜感激! 非常感谢!
根据文档,在 Docker 容器内运行两个(或更多)服务打破了单一责任的理念。
通常建议您通过每个容器使用一项服务来分隔关注区域。 该服务可能会分叉成多个进程(例如,Apache web 服务器启动多个工作进程)。 可以有多个进程,但要从 Docker 中获得最大收益,请避免一个容器负责整个应用程序的多个方面。 [...]
如果您选择遵循此建议,您将有两个选择:
选项 1 。 创建一个单独的容器来处理调度任务。
例子:
# File: Dockerfile
FROM php:7.4.8-fpm-alpine
COPY ./cron.d/tasks /cron-tasks
RUN touch /var/log/cron.log
RUN chown www-data:www-data /var/log/cron.log
RUN /usr/bin/crontab -u www-data /cron-tasks
CMD ["crond", "-f", "-l", "8"]
# File: cron.d/tasks
* * * * * echo "Cron is working :D" >> /var/log/cron.log 2>&1
# File: docker-compose.yml
services:
[...]
scheduling:
build:
context: ./build
dockerfile: cron.dockerfile
[...]
选项 2 。 使用自己主机的 crontab 在容器上执行计划任务(如本文所述)。
例子:
# File on host: /etc/cron.d/my-laravel-apps
* * * * * root docker exec -t laravel-container-A php artisan schedule:run >> /dev/null 2>&1
* * * * * root docker exec -t laravel-container-B php artisan schedule:run >> /dev/null 2>&1
* * * * * root docker exec -t laravel-container-C php artisan schedule:run >> /dev/null 2>&1
PS:在您的情况下,将 <laravel-container-*> 替换为php_ctrade 。
选项 3:使用supervisord
另一方面,如果你真的只想要一个容器,你仍然可以使用supervisord
作为你的主进程并将其配置为初始化(和监督) php-fpm
和crontab
应用程序。
请注意,这是一种中等重量的方法,需要您在镜像中使用 package supervisord 及其配置(或基于包含 supervisord 的镜像),以及它管理的不同应用程序。
您将在此处找到如何执行此操作的示例。
参考:
推荐阅读:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.