Php 如何在docker compose构建的LEMP堆栈中插入停靠的cron进程?
我有一个由docker compose文件构建的LEMP堆栈:Php 如何在docker compose构建的LEMP堆栈中插入停靠的cron进程?,php,nginx,docker,cron,docker-compose,Php,Nginx,Docker,Cron,Docker Compose,我有一个由docker compose文件构建的LEMP堆栈: cadvisor: image: google/cadvisor:latest container_name: lemp_cadvisor ports: - "8080:8080" volumes: - "/:/rootfs:ro" - "/var/run:/var/run:rw" - "/sys:/sys:ro" - "/var/lib/docker/:/var/lib/do
cadvisor:
image: google/cadvisor:latest
container_name: lemp_cadvisor
ports:
- "8080:8080"
volumes:
- "/:/rootfs:ro"
- "/var/run:/var/run:rw"
- "/sys:/sys:ro"
- "/var/lib/docker/:/var/lib/docker:ro"
base:
build: ./base
container_name: lemp_base
volumes:
- /home/core/server-lemp/www/:/var/www/:rw
phpmyadmin:
build: ./phpmyadmin
container_name: lemp_phpmyadmin
links:
- base
volumes:
- /var/www/phpmyadmin
- ./phpmyadmin/var/www/phpmyadmin/config.inc.php:/var/www/phpmyadmin/config.inc.php:rw
mariadb:
build: ./mariadb
container_name: lemp_mariadb
environment:
- MYSQL_ROOT_PASSWORD=pwd
links:
- base
volumes:
- /var/run/mysqld
- /home/core/server-lemp/mariadb/:/var/lib/mysql/:rw
- ./mariadb/etc/mysql/my.cnf:/etc/mysql/my.cnf:ro
ffmpeg:
build: ./ffmpeg
container_name: lemp_ffmpeg
links:
- base
volumes:
- /usr/ffmpeg
cron:
build: ./cron
container_name: lemp_cron
links:
- base
volumes:
- /etc/cron.weekly
- /etc/cron.d
- /etc/cron.hourly
- /etc/cron.daily
- /etc/cron.monthly
php:
build: ./php
container_name: lemp_php
links:
- base
volumes:
- /var/run/php-fpm
- ./php/usr/local/php7/etc/php-fpm.conf:/usr/local/php7/etc/php-fpm.conf:ro
- ./php/usr/local/php7/etc/php.ini:/usr/local/php7/etc/php.ini:ro
- ./php/usr/local/php7/etc/php-fpm.d/www.conf:/usr/local/php7/etc/php-fpm.d/www.conf:ro
volumes_from:
- base
- phpmyadmin
- mariadb
- ffmpeg
- cron
nginx:
build: ./nginx
container_name: lemp_nginx
links:
- base
ports:
- "80:80"
- "443:443"
volumes:
- /var/cache/nginx
- ./nginx/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
volumes_from:
- php
我的/cron/Dockerfile
如下所示:
# Lanti/lempCron
#
# VERSION 1.0.0
FROM lemp_base:latest
MAINTAINER XY <info@domain.com>
LABEL Description="Cron" Vendor="XY" Version="1.0"
RUN apt-get -y update && apt-get -y dist-upgrade \
&& apt-get -y install \
cron
RUN rm -rf /var/lib/apt/lists/*
CMD ["cron", "-f"]
我假设,由于造成这种情况的同一个错误,Nginx helper插件中的缓存清除选项也不起作用。Wordpress可能正在您的“php”容器中运行,“wp cron”函数可能正在那里工作。虽然它是“cron-like”,但它实际上是Wordpress的一部分
您已经为“php”容器定义了no,因此似乎需要更新,以便wp contain可以访问正确主机上的端口80。wp Cron实际上没有使用Cron,它是一个。如果您的web服务器正在侦听
0.0.0.0:80
(而且不仅是127.0.0.1:80
?在nginx.conf中,如果我为服务器名称定义这些IP地址:localhost
或127.0.0.1
或10.0.2.2
,错误消息始终保持不变。我是否应该尝试0.0.0
?我将其更改为0.0.0.0
。错误消息仍然出现。PHP正在与nginx c通信。)container通过套接字访问/var/run/php fpm
,这是nginx容器的一个共享卷,支持fpm/FastCGI。在这种情况下,我也必须创建一个端口吗?因此,在php映像中放置cron并启动这两个进程(php,cron)可能是个好主意就我个人而言,我觉得这个解决方案过于复杂,要么跳过使用容器,要么使用所有系统上可用的更简单的systemd nspawn
容器。特别是,有一个选项允许来宾操作系统与主机共享网络,从而节省了管理内部通信的时间ning networking,这是问题的根源。systemd nspawn
仍然为您提供进程隔离和chroot'ed环境。感谢您的帮助和建议!看起来我已经解决了它。我将cron移动到php容器中,并使用supervisord启动了这两个进程。接下来,我从docker compose文件中删除了链接(它将在将来被弃用,再加上不使用host
cmd),我从订购了带有volumes\u的容器,并在docker compose文件中的每个容器上放置了这一行:net:“host”
。通过这种方式,docker容器使用主机的网络,而不是桥接。我也遵循了由@thaJeztah链接的本教程:现在cron作业活跃起来了。但是有了这个新的堆栈,我遇到了一个新问题:完全删除/var/www
上的Web服务器文件。有什么提示我可以知道怎么做吗?
There was a problem spawning a call to the WP-Cron system on your site.
This means WP-Cron events on your site may not work. The problem was:
Failed to connect to 127.0.0.1 port 80: Connection refused