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

如何在执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:35:26