Docker本地WordPress开发中Cron调用接口连接失败求助
Docker本地WordPress开发:Cron服务无法访问WordPress容器的解决方案
问题描述
在Docker Compose搭建的本地WordPress开发环境中,配置了scheduling服务运行Cron任务,用于触发WordPress插件的内容导入操作。Cron服务可正常启动,但其中的wget请求始终报错:
wget: can't connect to remote host (127.0.0.1): Connection refused
现有环境配置
docker-compose.yml
version: '2' services: mysql: image: mysql:5.7 restart: always ports: - 8081:3306 environment: MYSQL_USER: wordpress MYSQL_ROOT_PASSWORD: wordpress MYSQL_DATABASE: wordpress MYSQL_PASSWORD: wordpress volumes: - ./db/:/var/lib/mysql/ wordpress: depends_on: - mysql build: ./docker/wordpress ports: - 80:80 restart: always volumes: - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini - ./themes/:/var/www/html/wp-content/themes/ - ./plugins/:/var/www/html/wp-content/plugins/ - ./uploads/:/var/www/html/wp-content/uploads/ environment: WORDPRESS_DB_HOST: mysql:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DEBUG: 1 WORDPRESS_TABLE_PREFIX: wp_ scheduling: extra_hosts: - "host.docker.internal:host-gateway" build: context: ./docker/scheduling network: host volumes: - ./cron-logs/:/var/log/
scheduling服务Dockerfile
# File: Dockerfile FROM php:7.4.8-fpm-alpine # Copy project-cron file to the cron.d directory COPY project-cron /etc/cron.d/cron # Give execution rights on the cron job RUN chmod 0644 /etc/cron.d/cron # Apply cron job RUN crontab /etc/cron.d/cron # Link cron log file to stdout RUN ln -s /dev/stdout /var/log/cron # Run the command on container startup CMD ["crond", "-f", "-l", "8"]
project-cron文件
# must be ended with a new line "LF" (Unix) and not "CRLF" (Windows) * * * * * echo "Current date is `date`" > /var/log/cron */5 * * * * wget -q -O - "http://localhost/wp-load.php?import_key=SMw2F9f&import_id=4&action=trigger" * * * * * wget -q -O - "http://localhost/wp-load.php?import_key=SMw2F9f&import_id=4&action=processing" # An empty line is required at the end of this file for a valid cron file.
问题原因
Docker Compose中每个服务对应独立容器,localhost在scheduling容器内指向自身,而非WordPress容器。同时scheduling服务配置的network: host和extra_hosts会干扰Docker内置的容器间DNS解析。
解决方案
1. 修改Cron任务的访问地址
将wget命令中的http://localhost替换为WordPress服务的名称http://wordpress——Docker Compose会自动为每个服务创建DNS记录,容器间可通过服务名直接访问。
修改后的project-cron:
# must be ended with a new line "LF" (Unix) and not "CRLF" (Windows) * * * * * echo "Current date is `date`" > /var/log/cron */5 * * * * wget -q -O - "http://wordpress/wp-load.php?import_key=SMw2F9f&import_id=4&action=trigger" * * * * * wget -q -O - "http://wordpress/wp-load.php?import_key=SMw2F9f&import_id=4&action=processing" # An empty line is required at the end of this file for a valid cron file.
2. 清理不必要的网络配置
删除scheduling服务中的extra_hosts和network: host配置,让其使用Docker Compose默认网络:
修改后的scheduling服务配置:
scheduling: build: context: ./docker/scheduling volumes: - ./cron-logs/:/var/log/
3. 重启服务使配置生效
执行命令重启服务:
docker-compose down docker-compose up -d --build
补充说明
- Docker Compose默认创建共享网络,服务间通过服务名+容器端口即可通信,无需依赖主机端口映射(主机端口映射仅用于外部访问容器)。
- 无需额外配置域名,Docker内置的服务名DNS解析足以满足容器间通信需求。
内容的提问来源于stack exchange,提问作者Pol
相关产品推荐
相关产品推荐

