无需额外Dockerfile,如何用Docker Compose在容器中装依赖并保持运行?
解决方法:无需额外Dockerfile,在Docker Compose中为php:8.1-apache安装mysqli并保持容器运行
容器启动后随即关闭的核心原因是:你设置的command替换了镜像默认的主进程命令。php:8.1-apache镜像默认的主进程是启动Apache的apache2-foreground,当你用安装命令替换后,命令执行完成就会导致主进程退出,容器随之关闭。
下面是可行的解决方案:
方案:通过Entrypoint组合初始化命令与主进程启动命令
在Docker Compose中使用entrypoint,先执行依赖安装操作,再启动镜像默认的Apache主进程,关键是用exec将主进程替换为当前容器的PID,确保容器持续运行。
完整的docker-compose.yml示例:
version: '3.8' services: php-apache: image: php:8.1-apache entrypoint: > bash -c " # 安装mysqli扩展 docker-php-ext-install mysqli && # 重启Apache使扩展生效 apachectl restart && # 执行镜像默认的entrypoint和主进程命令,exec确保成为容器主进程 exec docker-php-entrypoint apache2-foreground " ports: - "80:80"
关键细节说明
exec命令的作用:将后续的docker-php-entrypoint apache2-foreground替换为当前bash进程的PID,这样容器的主进程就变成了Apache的运行进程,而非临时的bash进程,避免命令执行完后容器退出。- 重复启动的影响:每次容器启动都会执行安装命令,但
docker-php-ext-install会检测模块是否已存在,重复执行不会造成问题。
验证安装结果
启动容器后,可通过以下命令检查mysqli是否成功安装:
docker exec <你的容器名称或ID> php -m | grep mysqli
如果输出mysqli,说明扩展安装成功。
内容的提问来源于stack exchange,提问作者Brad
相关产品推荐
相关产品推荐

