Docker compose 如何让crond在Docker容器中启动Alpine上的autostart?

Docker compose 如何让crond在Docker容器中启动Alpine上的autostart?,docker-compose,cron,alpine,Docker Compose,Cron,Alpine,我希望能够使用cron在一个容器服务中运行一个简单的bash脚本。我正在使用Alpine Linux,通过docker compose和一个自定义Dockerfile来生成一个基于php fpm的映像,我希望在这个映像上运行crond,但我不能 一旦在容器上执行ps aux | grep cron,则不会返回任何结果 据我所知,Docker容器中不存在常见的Linux启动过程-很好-那么如何自动启动crond?它在/etc/periodic/下的dir是自动创建的,所以我不明白为什么使用这些di

我希望能够使用cron在一个容器服务中运行一个简单的bash脚本。我正在使用Alpine Linux,通过
docker compose
和一个自定义Dockerfile来生成一个基于php fpm的映像,我希望在这个映像上运行
crond
,但我不能

一旦在容器上执行
ps aux | grep cron
,则不会返回任何结果

据我所知,Docker容器中不存在常见的Linux启动过程-很好-那么如何自动启动
crond
?它在
/etc/periodic/
下的dir是自动创建的,所以我不明白为什么使用这些dir的适用进程也没有运行

我尝试在
docker compose.yml
中创建一个专用的服务定义,这实际上是可行的,但是每小时运行的shell脚本需要访问在不同容器中运行的php二进制文件,因此这不是一个可行的解决方案

如果我将shell放入容器并运行
rc service crond start
我会得到这个消息,但它永远不会“完成”:

我需要一个可以放入
Dockerfile
docker compose.yml
文件的解决方案


Dockerd正在Ubuntu Xenial FWIW上运行。

要运行cronjob容器(Alpine),您需要确保docker容器的命令

exec crond -f
如果要将其添加到docker文件中

CMD ["exec", "crond", "-f"]
在运行上述命令之前,您可能还需要更新corn文件

基于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"]
最后,创建入口点(确保它散列执行权限)


您可以查看此链接以了解有关运行cronjob容器(Alpine)的更多信息,您需要确保docker容器的命令

exec crond -f
如果要将其添加到docker文件中

CMD ["exec", "crond", "-f"]
在运行上述命令之前,您可能还需要更新corn文件

基于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"]
最后,创建入口点(确保它散列执行权限)


有关

的更多信息,请查看此链接。此答案似乎是指通过CLI命令调用
crond
可执行文件。我正在特别寻找一种可以在Dockerfile或docker-compose.yml文件中作为行添加的解决方案。我对我的问题进行了编辑,以便更清楚地说明这一点。非常感谢。您也可以使用docker文件或compose中的命令,我用docker文件的示例更新了答案。你能用你的docker文件更新这个问题并编写吗?谢谢,我用它更新了我的
Dockerfile
,但正如我所怀疑的,
CMD
成为容器启动时运行的第一个(唯一的?)命令,这意味着我的
Dockerfile
是基于基本映像构建的,无法运行它自己的默认命令(启动php fpm). Dockerfile:docker编写代码片段:太棒了!非常感谢。这很有效。我没有想到在
docker compose.yml
中会出现服务定义重复,对于
命令
yml选项,也没有想到+1。这个答案似乎是指通过CLI命令调用
crond
可执行文件。我正在特别寻找一种可以在Dockerfile或docker-compose.yml文件中作为行添加的解决方案。我对我的问题进行了编辑,以便更清楚地说明这一点。非常感谢。您也可以使用docker文件或compose中的命令,我用docker文件的示例更新了答案。你能用你的docker文件更新这个问题并编写吗?谢谢,我用它更新了我的
Dockerfile
,但正如我所怀疑的,
CMD
成为容器启动时运行的第一个(唯一的?)命令,这意味着我的
Dockerfile
是基于基本映像构建的,无法运行它自己的默认命令(启动php fpm). Dockerfile:docker编写代码片段:太棒了!非常感谢。这很有效。我没有想到在
docker compose.yml
中复制服务定义,也没有想到在
命令的
yml选项中使用+1。