Docker php5-fpm服务退出(代码0)


Docker php5-fpm service exited (code 0)

看了很多题目,但看不懂是怎么回事。在我将ENTRYPOINT添加到我的Dockerfile之前,一切都很好。php-fpm:

FROM php:5.6-fpm
// ..Some installation instructions
# Entrypoint script
COPY ./run.sh /run.sh
RUN chmod +x /run.sh
ENTRYPOINT ["/run.sh"]
CMD ["php-fpm"]

run.sh的内容:

# Install all dependencies
php -d allow_url_fopen=on /usr/local/bin/composer install

据我所知,我的入口点将使用run.sh执行,然后退出。如果我将删除它,那么默认入口点将在后台启动nginx。运行shell脚本而不重新定义入口点的最佳解决方案是什么?或者我说错话了……

ENTRYPOINTCMD组合在一起创建在容器启动时运行的最终命令。在你的例子中,这给出:

["/run.sh", "php-fpm"]

表示php-fpm作为/run.sh脚本的参数。这显然不是你想要的。

您可以通过在脚本中启动php-fpm并确保它使用exec作为PID1运行来修复此问题。作为进程ID 1运行主进程确保它将接收SIGKILL和SIGTERM中断(例如Ctrl-C),并在可能的情况下优雅地退出。

# Install all dependencies
php -d allow_url_fopen=on /usr/local/bin/composer install
exec php-fpm

您的CMD应该为空(或删除,因为指定ENTRYPOINT也会重置CMD):

CMD []

然后在您的容器中,您可以通过命令指定php-fpm的参数。如:

docker run -d my_php_fpm_image --help

问题是:

启动后台nginx

您需要在前台运行一个进程。如果没有,容器将退出。我认为你应该让nginx在前台运行。

使用:

php-fpm -F -R

From php-fpm help:

-F, --nodaemonize强制留在前台,并忽略配置文件中的daemonize选项
-R, --allow-to-run-as-root允许池作为root运行(默认禁用)

找到了将composer放在单独容器中的方法。因此,我根本不会碰php-fpm,因为最佳实践是每个容器一个进程。我的应用程序容器,包含所有的项目文件(作曲家。. json, .git等)将提供Dockerfile:

FROM composer/composer:php5
# Set application directory
WORKDIR /var/www/html
ENTRYPOINT /usr/local/bin/composer install
CMD ["true"]

启动 docker-compose up -d 后,这将带来来自composer的所有依赖项。Json到映射目录。