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

如何在Docker容器启动前运行操作Docker Compose共享卷的脚本?

解决方法

方法一:自定义Entrypoint脚本(适用于每次容器启动都需执行setup)

创建一个自定义的entrypoint脚本,先执行setup.sh,再启动PHP-FPM。这样脚本会在容器启动初期运行,完成后再启动主服务。

步骤1:编写entrypoint.sh

创建dockerfiles/php/entrypoint.sh文件:

#!/bin/sh
# 执行setup脚本
echo "Running setup script..."
/usr/local/bin/setup.sh
echo "Setup completed."

# 启动PHP-FPM,使用exec确保信号能正确传递
exec /usr/sbin/php-fpm

步骤2:更新Dockerfile

修改Dockerfile,复制并设置entrypoint脚本的权限,同时指定ENTRYPOINT:

COPY dockerfiles/php/setup.sh /usr/local/bin/setup.sh
COPY dockerfiles/php/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/setup.sh /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

步骤3:添加健康检查(监控服务就绪状态)

在compose.yml的php服务中添加健康检查,直观查看PHP-FPM何时启动完成:

php:
  volumes:
    - type: bind
      source: ./apps
      target: /var/www
  healthcheck:
    test: ["CMD-SHELL", "pgrep php-fpm || exit 1"] # 检查php-fpm进程是否存在
    interval: 10s
    timeout: 5s
    retries: 5
    start_period: 60s # 预留setup脚本执行的时间(约1分钟)

之后可通过docker compose ps查看容器健康状态,当状态变为healthy时,说明setup已完成且PHP-FPM就绪。

方法二:使用初始化容器(适用于一次性setup)

如果setup脚本仅需执行一次(比如初始化共享卷内容),可以用Docker Compose的初始化容器,先完成setup再启动PHP容器。

修改compose.yml

services:
  php-setup:
    build: ./path/to/php-dockerfile # 和PHP服务使用相同的镜像构建配置
    volumes:
      - type: bind
        source: ./apps
        target: /var/www
    command: /usr/local/bin/setup.sh # 仅执行setup脚本
    restart: "no" # 执行完成后自动退出

  php:
    build: ./path/to/php-dockerfile
    volumes:
      - type: bind
        source: ./apps
        target: /var/www
    depends_on:
      php-setup:
        condition: service_completed_successfully # 等待setup容器成功完成后再启动
    # 原PHP服务的其他配置

这种方式下,PHP容器只会在setup脚本执行完成后才启动,容器启动后PHP-FPM已就绪,无需额外等待。

内容的提问来源于stack exchange,提问作者justwanderedin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:25:16