繁体   English   中英

配置 Dockerfile 以运行 cronjob

[英]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-fpmcrontab应用程序。

请注意,这是一种中等重量的方法,需要您在镜像中使用 package supervisord 及其配置(或基于包含 supervisord 的镜像),以及它管理的不同应用程序。

您将在此处找到如何执行此操作的示例。


参考:

推荐阅读:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM