添加command后Docker Compose的app容器异常停止求助
问题分析
你的app容器停止,核心是command里的命令链存在多个致命问题,只要其中一步失败,整个bash脚本就会退出,容器随之停止:
- 复制命令逻辑错误:
cp -r /var/www/html/* /var/www/html/.docker/会把当前目录下的所有内容(包括.docker本身)递归复制到.docker目录,触发循环复制,直接导致命令失败。 - Composer未安装:
php:8.1.0-apache镜像默认没有预装Composer,执行composer install会报错退出。 - Apache重启方式错误:Docker容器依赖主进程维持运行,原镜像的主进程是Apache,用
service apache2 restart会终止原主进程,后续的tail -f /dev/null即使执行,也会因为主进程替换导致容器稳定性问题。
修复后的配置方案
替换app服务的command,调整逻辑并补充必要依赖安装:
version: '3' services: app: image: php:8.1.0-apache ports: - "8080:80" volumes: - .:/var/www/html environment: APP_ENV: development working_dir: /var/www/html command: > bash -c " # 复制配置文件到对应目录 cp /var/www/html/.docker/php.ini /usr/local/etc/php/ && cp /var/www/html/.docker/default.config /etc/apache2/sites-available/000-default.conf && # 启用Apache rewrite模块 a2enmod rewrite && # 安装Composer php -r \"copy('https://getcomposer.org/installer', 'composer-setup.php');\" && php -r \"if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;\" && php composer-setup.php && php -r \"unlink('composer-setup.php');\" && # 执行Composer依赖安装 php composer.phar install && # 用官方前台命令启动Apache,维持容器运行 apache2-foreground " prometheus: image: prom/prometheus:v2.40.0 container_name: prometheus ports: - 9090:9090 command: - --config.file=/etc/prometheus/prometheus.yml volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro grafana: image: grafana/grafana:9.2.0 ports: - "3000:3000" container_name: grafana depends_on: - prometheus volumes: - ./grafana-storage:/var/lib/grafana
关键调整说明
- 删除错误复制命令:去掉了会导致循环复制的
cp -r /var/www/html/* /var/www/html/.docker/,只保留必要的配置文件复制步骤。 - 预装Composer:添加官方标准的Composer安装流程,确保
composer install命令可以正常执行。 - 改用官方Apache启动命令:用
apache2-foreground替代service apache2 restart && tail -f /dev/null,该命令会以前台方式运行Apache,作为容器的主进程,从根本上保证容器持续运行。 - 命令链容错:所有步骤用
&&串联,只有前一步执行成功才会推进到下一步,方便通过docker logs <app容器名>排查具体失败环节。
内容的提问来源于stack exchange,提问作者Andre Neves
相关产品推荐
相关产品推荐

