Dockerfile构建容器 nginx+php nginx不会自动启动

# 设置基础镜像
FROM php:8.2-fpm

# 更新系统
RUN apt-get update && apt-get upgrade -y

# 安装 Nginx 和其他依赖
RUN apt-get install -y nginx libmcrypt-dev libicu-dev libzip-dev zip unzip git net-tools &&
docker-php-ext-install pdo_mysql mysqli intl zip opcache

# 添加 Nginx 配置文件
COPY laravel.conf /etc/nginx/conf.d/larave.conf

# 暴露端口
EXPOSE 80
CMD service nginx start

使用CMD service nginx start 以后容器起不来 不适用的话nginx又不会启动

请大哥们分享一下自用的dockerfile 万分感谢

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

你缺失了很多基础知识,我大概给你系统的讲一下吧:
Linux程序启动方式我们俗称的有两种:前台启动、后台启动。
一个docker容器要存活,必须有一个前台启动方式的进程去维持它,不然它会退出。

你基于FROM php:8.2-fpm做的镜像,它最后的一行本来是 CMD ["php-fpm"],你再写的CMD service nginx start就会覆盖前面的CMD,但是你的service nginx start命令是后台启动方式,所以你的容器相当于没有一个前台启动方式的进程去维持它,所以会退出。

你可以按如下方式修改:
CMD ["sh", "-c", "service nginx start && php-fpm"]

每个人环境不同,配置不同,也许上面的启动顺序,你可能会遇到nginx报错说找不到127.0.0.1:9000,这时候怎么办呢,懂了原理其实也挺简单的,我们换一下顺序,让php先后台启动,然后nginx再前台启动,如:
先将php-fpm.conf里面的配置改为daemonize = yes,然后
CMD ["sh", "-c", "php-fpm && nginx -g 'daemon off;'"]

1年前 评论
ysnow (楼主) 1年前
讨论数量: 5

你缺失了很多基础知识,我大概给你系统的讲一下吧:
Linux程序启动方式我们俗称的有两种:前台启动、后台启动。
一个docker容器要存活,必须有一个前台启动方式的进程去维持它,不然它会退出。

你基于FROM php:8.2-fpm做的镜像,它最后的一行本来是 CMD ["php-fpm"],你再写的CMD service nginx start就会覆盖前面的CMD,但是你的service nginx start命令是后台启动方式,所以你的容器相当于没有一个前台启动方式的进程去维持它,所以会退出。

你可以按如下方式修改:
CMD ["sh", "-c", "service nginx start && php-fpm"]

每个人环境不同,配置不同,也许上面的启动顺序,你可能会遇到nginx报错说找不到127.0.0.1:9000,这时候怎么办呢,懂了原理其实也挺简单的,我们换一下顺序,让php先后台启动,然后nginx再前台启动,如:
先将php-fpm.conf里面的配置改为daemonize = yes,然后
CMD ["sh", "-c", "php-fpm && nginx -g 'daemon off;'"]

1年前 评论
ysnow (楼主) 1年前

参考laradock,会把startup.sh复制到容器内,然后CMD ["/opt/startup.sh"]

1年前 评论

你缺失了很多基础知识,我大概给你系统的讲一下吧:
Linux程序启动方式我们俗称的有两种:前台启动、后台启动。
一个docker容器要存活,必须有一个前台启动方式的进程去维持它,不然它会退出。

你基于FROM php:8.2-fpm做的镜像,它最后的一行本来是 CMD ["php-fpm"],你再写的CMD service nginx start就会覆盖前面的CMD,但是你的service nginx start命令是后台启动方式,所以你的容器相当于没有一个前台启动方式的进程去维持它,所以会退出。

你可以按如下方式修改:
CMD ["sh", "-c", "service nginx start && php-fpm"]

每个人环境不同,配置不同,也许上面的启动顺序,你可能会遇到nginx报错说找不到127.0.0.1:9000,这时候怎么办呢,懂了原理其实也挺简单的,我们换一下顺序,让php先后台启动,然后nginx再前台启动,如:
先将php-fpm.conf里面的配置改为daemonize = yes,然后
CMD ["sh", "-c", "php-fpm && nginx -g 'daemon off;'"]

1年前 评论
ysnow (楼主) 1年前

你这是想在镜像里放nginx,放php,放mysql,你应该使用centos或ubuntu的镜像。

就是第一句的 from 需要修改,比如改成:FROM centos:7.9.2009

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!