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

时间:2016-10-14 15:52:10

标签: php docker docker-compose

阅读了很多主题,但无法理解发生了什么。在将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脚本的最佳解决方案是什么?或者我可能会说错话......

3 个答案:

答案 0 :(得分:2)

将ENTRYPOINT和CMD组合在一起,以创建在启动容器时运行的最终COMMAND。在你的情况下,这给出:

["/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应该是空的:

CMD []

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

docker run -d my_php_fpm_image --help

答案 1 :(得分:0)

问题在于:

  

在后台启动nginx

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

答案 2 :(得分:0)

找到将作曲家放在单独容器中的方法。所以我根本不会触摸我的php-fpm,因为最好的做法是每个容器一个进程。 我的app容器包含所有项目文件(composer.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中的所有依赖项带入映射目录。