如何在docker-compose.yml中配置容器启动后执行指定命令?
问题原因
你遇到的容器启动后立即停止的问题,是因为**command指令覆盖了官方php:8.0-apache镜像的默认启动命令**。这个镜像的默认主进程是启动Apache服务(命令为apache2-foreground),当你用command: sh -c "docker-php-ext-install mysqli"替换后,容器只会执行安装mysqli的命令,命令执行完毕后主进程结束,容器就自动停止了。
正确解决方法
方法一:自定义Dockerfile(推荐)
这种方式会把扩展安装到镜像里,后续启动容器不用重复安装,更高效。
- 在项目根目录创建
Dockerfile,内容如下:
FROM php:8.0-apache # 安装mysqli扩展 RUN docker-php-ext-install mysqli # 保留官方镜像的默认启动命令(可选,官方镜像已默认定义) CMD ["apache2-foreground"]
- 修改
docker-compose.yml,将image替换为build指令:
php-enc: container_name: php-apache build: . # 指向Dockerfile所在目录 volumes: - ./php/src:/var/www/html/ ports: - 8000:80 depends_on: - db
- 重新构建并启动容器:
docker-compose up --build
方法二:在command中串联启动命令
如果不想自定义镜像,可以在command里先执行扩展安装,再启动Apache服务:
修改docker-compose.yml的command部分:
php-enc: container_name: php-apache image: php:8.0-apache command: sh -c "docker-php-ext-install mysqli && apache2-foreground" volumes: - ./php/src:/var/www/html/ ports: - 8000:80 depends_on: - db
注意:这种方式每次启动容器都会重新安装一次mysqli扩展,启动速度会变慢,适合临时测试场景。
内容的提问来源于stack exchange,提问作者PatMan
相关产品推荐
相关产品推荐

