如何让 crond 在 Docker 容器中在 Alpine 上自动启动?
How do I get crond to autostart on Alpine in a Docker container?
我希望能够使用 cron 在一个小时内在容器服务中 运行 一个简单的 bash 脚本。我通过 docker-compose
使用 Alpine Linux 和自定义 Docker 文件来生成基于 php-fpm 的图像,我希望在其上获得 crond
运行宁也一样-除了我不能。
构建后在容器上执行 ps aux | grep cron
,returns 什么都没有。
据我了解,Docker 容器中不存在通常的 Linux 启动过程 - 很好 - 那么 如何实现 自动启动crond
?它在 /etc/periodic/
下的目录是自动创建的,所以我不明白为什么使用这些目录的适用进程不是 运行ning.
我尝试在 docker-compose.yml
中创建一个专用的服务定义,这确实有效,但是要成为 运行 每小时的 shell 脚本需要访问一个 php 二进制文件,它是运行在不同的容器中,所以这不是一个可行的解决方案。
如果我 shell 进入容器并且 运行 rc-service crond start
我明白了 - 但它从来没有 "finishes":
/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 in
web_server)
YOUR WEB SERVER COMMAND
;;
cron_jobs)
exec crond -f
;;
*)
exec "$@"
;;
esac
exit 0
您可以查看此 link 以了解有关 entrypoints
的更多信息
我希望能够使用 cron 在一个小时内在容器服务中 运行 一个简单的 bash 脚本。我通过 docker-compose
使用 Alpine Linux 和自定义 Docker 文件来生成基于 php-fpm 的图像,我希望在其上获得 crond
运行宁也一样-除了我不能。
构建后在容器上执行 ps aux | grep cron
,returns 什么都没有。
据我了解,Docker 容器中不存在通常的 Linux 启动过程 - 很好 - 那么 如何实现 自动启动crond
?它在 /etc/periodic/
下的目录是自动创建的,所以我不明白为什么使用这些目录的适用进程不是 运行ning.
我尝试在 docker-compose.yml
中创建一个专用的服务定义,这确实有效,但是要成为 运行 每小时的 shell 脚本需要访问一个 php 二进制文件,它是运行在不同的容器中,所以这不是一个可行的解决方案。
如果我 shell 进入容器并且 运行 rc-service crond start
我明白了 - 但它从来没有 "finishes":
/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 in
web_server)
YOUR WEB SERVER COMMAND
;;
cron_jobs)
exec crond -f
;;
*)
exec "$@"
;;
esac
exit 0
您可以查看此 link 以了解有关 entrypoints
的更多信息