如何在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
相关产品推荐
相关产品推荐

