如何让Apache作为Docker容器的主进程运行以避免容器退出?
Docker容器中让Apache持续运行的解决方法
问题描述
在Docker容器中运行Apache时,执行apachectl start后Apache会转入后台运行,导致apachectl主进程退出,容器随即以代码0终止。执行docker compose up --build后看到如下输出:
Container docker-web-server-1 Recreated
web-server-1 exited with code 0
原Dockerfile
FROM ubuntu RUN apt update -y && apt upgrade -y RUN apt install -y apache2 php RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" RUN php composer-setup.php RUN php -r "unlink('composer-setup.php');" RUN mv composer.phar /usr/local/bin/composer WORKDIR /var/www CMD ["apachectl", "start"] EXPOSE 80 443
原docker-compose.yml片段
web-server: build: ./apache volumes: - ../src:/var/www - ./conf:/etc/apache2/sites-enabled ports: - "80:80" - "443:443" networks: - internal
解决方案
要让Apache作为容器的主进程持续运行,核心是让它前台启动,避免转入后台。有两种常用方式:
1. 修改Dockerfile的CMD指令(推荐)
将原CMD ["apachectl", "start"]替换为:
CMD ["apachectl", "-D", "FOREGROUND"]
-D FOREGROUND是Apache官方指定的前台运行参数,会让httpd进程保持在前台,成为容器的主进程,从而维持容器存活。
也可以直接调用httpd二进制文件启动:
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
2. 交互模式临时启动调试
如果需要进入容器bash交互模式手动启动Apache,先运行容器进入bash:
docker compose run --rm web-server bash
进入容器后执行前台启动命令:
apachectl -D FOREGROUND
原因说明
apachectl start默认会让Apache以守护进程(后台)模式运行,执行完该命令后apachectl进程就会退出。而Docker容器的存活依赖于主进程的运行,主进程退出后容器就会随之终止。必须让Apache的核心进程成为容器的主进程并保持前台运行,才能让容器持续存活。
内容的提问来源于stack exchange,提问作者Kostya Bronshteyn
相关产品推荐
相关产品推荐

