Docker容器内symfony serve -d无法自启动Symfony5服务怎么解决
问题根因
- Dockerfile中的
RUN指令仅在镜像构建阶段执行,你编写的RUN symfony serve -d只是构建镜像时临时启动了一次服务,镜像构建完成后该进程就会终止,容器启动时不会自动执行该命令 php:7.4-fpm-alpine基础镜像默认的启动命令是启动php-fpm服务,不会主动启动Symfony内置服务- 额外隐藏问题:docker-compose.yml中配置了本地目录挂载到容器的
/var/www/html,会覆盖镜像构建阶段COPY到容器内的代码、以及composer install生成的依赖文件,若本地未执行过依赖安装会导致服务启动异常
修复步骤
1. 修改Dockerfile
删除最后一行RUN symfony serve -d,新增CMD指令指定容器启动时的前台运行命令,避免容器启动后进程退出:
FROM php:7.4-fpm-alpine # Update RUN apk --no-cache update RUN apk --no-cache add bash git # Install Node RUN apk --no-cache add --update nodejs npm RUN apk --no-cache add --update python3 RUN apk --no-cache add --update make RUN apk --no-cache add --update g++ # Install pdo RUN docker-php-ext-install pdo_mysql # Install Composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # Symfony CLI RUN curl -sS https://get.symfony.com/cli/installer | bash && mv /root/.symfony/bin/symfony /usr/local/bin/symfony # WORK DIR COPY . /var/www/html WORKDIR /var/www/html RUN composer update RUN composer install RUN npm install # Start Symfony server on Port 8000 EXPOSE 8000 # 前台启动Symfony服务,作为容器主进程运行 CMD ["symfony", "serve", "--no-daemon", "--port=8000"]
2. 调整docker-compose.yml(可选)
如果本地开发环境没有安装PHP、composer等依赖,建议排除依赖目录的挂载,避免本地文件覆盖容器内安装的依赖:
version: '3.8' services: php-fpm: container_name: infolea build: ./ ports: - 8080:8000 volumes: - ./:/var/www/html # 排除依赖目录,不被本地文件覆盖 - /var/www/html/vendor - /var/www/html/node_modules
3. 重新构建启动容器
执行以下命令让配置生效:
# 停止并删除旧的运行容器 docker-compose down # 重新构建镜像并后台启动 docker-compose up -d --build
注意:Symfony内置服务器仅适用于开发环境,生产环境建议搭配Nginx + PHP-FPM的架构部署。
内容的提问来源于stack exchange,提问作者ImBadr
相关产品推荐
相关产品推荐

