docker-compose - 如何在 Docker 容器中让 crond 在 Alpine 上自动启动?
问题描述
我希望能够使用 cron 每小时在容器服务中运行一个简单的 bash 脚本。我通过docker-compose
自定义 Dockerfile 使用 Alpine Linux 来生成基于 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
我需要一个可以放入我的Dockerfile
或docker-compose.yml
文件中的解决方案。
Dockerd 在 Ubuntu Xenial FWIW 上运行。
解决方案
要运行 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
您可以查看此链接以获取有关入口点的更多信息
推荐阅读
- c# - 从数据库中获取插入 ID 的问题
- python - 具有相同 ID 的 Xpath - 如何获取第二个元素?
- node.js - 启动新的 Sequelize 后端并且无法连接到 SQLite DB
- swift - 尝试使用核心数据保存值但遇到错误:“libc++abi.dylib:以 NSException 类型的未捕获异常终止”
- python - 为什么Django在生产服务器(WebFaction)中遇到ModuleNotFoundError,而它可以在开发服务器上运行良好?
- javascript - 有没有办法通过 setInterval() 函数返回一个布尔值?
- string - 在 VB.net 中从字符串中删除字符时遇到问题
- html - 浏览器显示文本但文本不在 HTML 代码中
- javascript - 如何使用 Ramda 通过 id 查找和注入外来对象?
- c# - Visual Studio 不会从我的 nupkg 中读取 .pdb