Docker compose 如何让crond在Docker容器中启动Alpine上的autostart?
我希望能够使用cron在一个容器服务中运行一个简单的bash脚本。我正在使用Alpine Linux,通过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
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。