【问题标题】:How do I get crond to autostart on Alpine in a Docker container?如何在 Docker 容器中让 crond 在 Alpine 上自动启动?
【发布时间】:2020-04-06 09:38:36
【问题描述】:

我希望能够使用 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 上运行。

【问题讨论】:

    标签: docker-compose cron alpine


    【解决方案1】:

    要运行一个 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
    

    您可以查看此链接以获取有关entrypoints 的更多信息

    【讨论】:

    • 这个答案似乎是指通过 CLI 命令调用 crond 可执行文件。我正在专门寻找一种可以在我的 Dockerfile 或 docker-compose.yml 文件中添加为行的解决方案。我已经编辑了我的问题以使其更清楚。非常感谢。
    • 您也可以从 docker 文件或 compose 中使用该命令,我用 docker 文件的示例更新了答案。你能用你的 docker 文件更新问题并撰写吗?
    • 谢谢,我用它更新了我的Dockerfile,但正如我所怀疑的,CMD 成为在容器启动时运行的第一个(唯一?)命令,这意味着我的基本映像 Dockerfile建立在,无法运行 它自己的 默认命令(启动 php-fpm)。 Dockerfile:gist.github.com/dcentrica/60804132381302b587f4c65e09e2c576docker-compose sn-p:gist.github.com/dcentrica/efcea99ab567c44cd9dd33e9acf939a8
    • 太棒了!谢谢!这行得通。我没有想到 docker-compose.yml 中的服务定义重复以及 command YML 选项的 +1。
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 2023-01-22
    • 1970-01-01
    • 2016-10-27
    • 2016-12-17
    相关资源
    最近更新 更多