如何在执行docker compose up -d时启动并持续运行PHP脚本?
可以在Docker Compose启动时运行PHP脚本,以下是可行的实现方案
核心要点
要实现这个需求,关键解决两个问题:
- 确保MariaDB服务完全就绪后再执行PHP脚本(避免因数据库未启动完成导致脚本连接失败)
- 正确配置PHP容器的启动逻辑,让脚本在容器启动时自动执行
方案一:结合wait-for-it与启动脚本(适配你已尝试的思路)
1. 整理文件结构
your-project/ ├── docker-compose.yml ├── php/ │ ├── Dockerfile │ ├── wait-for-it.sh │ ├── start_data_collection.sh │ └── collect_data.php
2. PHP容器的Dockerfile配置
# 基于官方PHP镜像,选择带数据库扩展的版本 FROM php:8.2-cli # 安装PHP数据库扩展(根据脚本依赖选择) RUN docker-php-ext-install mysqli pdo_mysql # 复制并配置wait-for-it脚本 COPY wait-for-it.sh /usr/local/bin/wait-for-it.sh RUN chmod +x /usr/local/bin/wait-for-it.sh # 复制启动脚本与PHP数据收集脚本 COPY start_data_collection.sh /usr/local/bin/start_data_collection.sh COPY collect_data.php /app/collect_data.php RUN chmod +x /usr/local/bin/start_data_collection.sh # 设置工作目录 WORKDIR /app # 启动命令:先等待MariaDB就绪,再执行数据收集脚本 CMD ["wait-for-it.sh", "mariadb:3306", "--strict", "--timeout=60", "--", "start_data_collection.sh"]
3. start_data_collection.sh内容
#!/bin/sh # 执行PHP数据收集脚本 php /app/collect_data.php # 可选:若需保持容器运行,添加常驻进程(脚本为一次性任务时可省略) # tail -f /dev/null
4. Docker Compose配置
version: '3.8' services: mariadb: image: mariadb:10.11 environment: MYSQL_ROOT_PASSWORD: your_root_pw MYSQL_DATABASE: your_db_name MYSQL_USER: your_db_user MYSQL_PASSWORD: your_db_pw volumes: - mariadb_data:/var/lib/mysql # 添加健康检查,确保Docker识别MariaDB服务就绪 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"] interval: 5s timeout: 5s retries: 5 php-collector: build: ./php depends_on: # 等待MariaDB健康检查通过后再启动PHP容器 mariadb: condition: service_healthy environment: # 传递数据库连接参数给PHP脚本 DB_HOST: mariadb DB_NAME: your_db_name DB_USER: your_db_user DB_PASS: your_db_pw API_URL: "https://your-api-url.com/data" volumes: mariadb_data:
方案二:直接在CMD中执行PHP脚本(简化版)
如果你的数据收集脚本是一次性任务,无需容器持续运行,可以直接简化配置:
FROM php:8.2-cli RUN docker-php-ext-install mysqli pdo_mysql COPY collect_data.php /app/collect_data.php WORKDIR /app # 用wait-for-it直接调用PHP脚本 CMD ["wait-for-it.sh", "mariadb:3306", "--strict", "--timeout=60", "--", "php", "collect_data.php"]
常见问题排查
- 脚本执行失败容器直接退出:通过
docker logs <php-container-name>查看日志,检查数据库连接参数、API地址是否正确 - wait-for-it未生效:确认
wait-for-it.sh权限为可执行,且Dockerfile中复制路径无误 - 容器执行完脚本就退出:若需容器保持运行,在启动脚本末尾添加
tail -f /dev/null或启动常驻进程(如PHP内置服务器)
内容的提问来源于stack exchange,提问作者pheromone42
相关产品推荐
相关产品推荐

