Docker构建Apache2+PHP镜像 配置FOREGROUND后容器启动即退出
问题原因
- 启动命令拼接逻辑错误:你写的
ENTRYPOINT ["/bin/sh", "-c"]搭配JSON数组格式的CMD时,sh只会读取CMD的第一个元素作为执行命令,-D、FOREGROUND两个参数会被直接丢弃。容器实际执行的只有apache2ctl,没有前台运行参数,Apache启动后会自动切到后台守护运行,PID为1的启动进程执行完直接退出,容器就跟着停了。 - 缺失核心安装包:整个Dockerfile的apt安装列表里没有
apache2包本身,容器里根本不存在apache2相关命令,启动时会直接报命令不存在的错误;同时你只装了php-fpm,没装libapache2-mod-php模块,就算Apache跑起来也没法解析PHP文件。 - 环境变量拼写错误:
APACHE_LOF_DIR是笔误,正确变量名应为APACHE_LOG_DIR,拼写错误会导致Apache启动时找不到日志目录配置。
修复步骤
- 替换Dockerfile内容为以下修正版本:
FROM ubuntu:latest RUN apt update -y && apt upgrade -y RUN apt install software-properties-common -y RUN add-apt-repository ppa:ondrej/php -y RUN apt update -y && apt upgrade -y ARG DEBIAN_FRONTEND=noninteractive # 补装apache2和Apache PHP处理模块 RUN DEBIAN_FRONTEND=noninteractive apt install -y nano vim iputils-ping sudo git curl apache2 php php-cli libapache2-mod-php RUN apt install -y php-json php-mysql RUN apt install -y php-zip php-mbstring php-curl php-xml php-pear php-bcmath RUN apt install psmisc -y ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data # 修正日志目录变量拼写 ENV APACHE_LOG_DIR /var/log/apache2 EXPOSE 80/tcp # 去掉多余的sh -c包装,直接以前台模式启动Apache CMD ["apache2ctl", "-D", "FOREGROUND"]
- 重新构建镜像:
docker build -t www .
- 启动容器:
docker run -itd -p 80:80 www
启动后执行docker ps就能看到正常运行的容器,访问宿主机80端口即可看到Apache默认页面。如果后续启动仍有异常,直接执行docker logs <对应容器ID>就能看到具体报错信息,快速定位问题。
内容的提问来源于stack exchange,提问作者DevWL
相关产品推荐
相关产品推荐

