You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:04:59