如何通过Docker Compose运行两个RabbitMQ关联的PHP脚本?
解决方案
要让两个容器分别运行send.php和receive.php,只需在docker-compose.yml中为每个服务显式指定运行命令,同时优化配置中的冗余项,具体步骤如下:
1. 调整Dockerfile(可选但推荐)
如果你的Dockerfile当前固定了CMD ["php", "./send.php"],可以将其改为通用形式,让容器更灵活:
FROM php:7.4.cli # 安装RabbitMQ PHP扩展(如果你的脚本依赖此扩展) RUN apt-get update && apt-get install -y librabbitmq-dev \ && pecl install amqp \ && docker-php-ext-enable amqp # 设置容器内默认工作目录 WORKDIR /app # 改为通用CMD,方便后续在docker-compose中覆盖 CMD ["php"]
2. 修改docker-compose.yml配置
更新配置,为send和receive服务指定各自的运行命令,并清理不必要的端口:
version: "3" services: rabbit_mq: image: rabbitmq:3-management-alpine container_name: 'rabbitmq' ports: - 5672:5672 # RabbitMQ服务端口 - 15672:15672 # 管理界面端口 volumes: - ./docker/rabbitmq/data/:/var/lib/rabbitmq/ - ./docker/rabbitmq/log/:/var/log/rabbitmq - ./docker/rabbitmq/conf/:/var/conf/rabbitmq environment: - API_URL=Api:8000 send: build: context: './docker' dockerfile: Dockerfile container_name: send working_dir: /app volumes: - ./:/app # 显式指定运行send.php脚本 command: ["php", "./send.php"] depends_on: - rabbit_mq receive: # 和send服务使用同一个自定义镜像,确保PHP环境依赖一致 build: context: './docker' dockerfile: Dockerfile container_name: receive working_dir: /app volumes: - ./:/app # 显式指定运行receive.php脚本 command: ["php", "./receive.php"] depends_on: - rabbit_mq
3. 关键说明
- 显式指定command:通过
command字段覆盖Dockerfile中的默认CMD,强制每个容器执行对应的脚本。 - 统一镜像构建:让
send和receive使用同一个自定义镜像,避免因环境差异导致的依赖问题。 - 移除无用端口:
send.php和receive.php是CLI脚本,不需要对外暴露端口,删除ports配置可减少资源占用。 - 工作目录对齐:通过
working_dir: /app确保容器内工作目录与挂载的本地目录一致,脚本路径更清晰。
4. 启动验证
执行以下命令启动所有服务:
docker-compose up -d
查看容器运行状态:
docker-compose ps
查看容器日志验证脚本运行情况:
# 查看send容器日志 docker-compose logs send # 查看receive容器日志 docker-compose logs receive
内容的提问来源于stack exchange,提问作者Darya
相关产品推荐
相关产品推荐

