2016-10-14 99 views
1

閱讀了很多主題,但無法理解發生了什麼。在將入口點添加到我的Dockerfile之前,所有工作都正常。集裝箱立即停止不妖魔化PHP-FPM:Docker php5-fpm服務退出(代碼0)

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腳本的最佳解決方案是什麼?或者,也許我說的是錯的東西..

回答

0

問題是這樣的:

背景

開始nginx的你需要在前臺運行的進程。如果沒有,容器將退出。我認爲你應該保持nginx在前臺運行。

+0

我需要一個解決方案,它會自動在我的目標文件夾中部署git和composer。所以我把我的php-fpm容器放到了dockerfile中。所有的東西都部署在我的文件夾中,但php-fpm不啓動,因爲我把我的作曲家安裝在ENTRYPOINT中,而CMD命令根本沒有啓動 –

+0

我想你可能會對CMD應該做的事感到困惑。請參閱http:// stackoverflow。COM /問題/ 21553353 /什麼,是最差CMD-和入口點-IN-A-dockerfile間。容器只運行一個進程。 – dnephin

1

將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

0

發現把作曲家在單獨的容器的方式。所以我不會碰到我的php-fpm,因爲最佳實踐是每個容器一個進程。 包含所有項目文件(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依賴到映射目錄。