2015-10-08 45 views
24

我想運行一個腳本,運行一個腳本這是我的docker-compose.yml片段。其他設置MySQL服務器,Redis的......等等....但它們不會導致任何問題泊塢窗,撰寫陽明經過長達

web: 
    image: nginx 
    container_name: web-project 
    volumes: 
    - ./code:/srv 

    working_dir: /srv/myweb 
    extra_hosts: 
    - "myweb.local:127.0.0.1" 
    ports: 
    - 8081:80 
# tty: true 
    command: sh /srv/scripts/post-run-web.sh 

所以每當我運行docker-compose up -d奧德docker-compose up這一切停止。 (容器不能繼續運行)。雖然我的shell腳本很簡單(運行回聲...或phpunit)。這是我的腳本。

#!/bin/bash 

echo running post install scripts for web..; 
cd /srv/myweb 
npm install 
composer self-update 
composer update 

這是我得到的錯誤。這就像服務器(nginx)還沒有運行。另外,如果我使用exec bash連接到服務器,並檢查進程。我沒有看到nginx運行(還)。

web_1  | You are already using composer version 7a9eb02190d334513e99a479510f87eed18cf958. 
web_1  | Loading composer repositories with package information 
web_1  | Updating dependencies (including require-dev) 
web_1  | Generating autoload files 
web-project exited with code 0 
Gracefully stopping... (press Ctrl+C again to force) 
Stopping mysql-project... done 
Stopping rabbitmq-project... done 
Stopping redis-project... done 

那麼爲什麼它正在退出,儘管腳本語法正確?我如何使它正確運行? (我在做什麼,設置錯了!)

+0

你試圖讓事情自動後運行或手動確定嗎?你可以使用'docker exec $(docker-compose ps -q web)some_command'在已經運行的容器中運行一些東西。 –

回答

24

command覆蓋默認命令。

這就是你的容器停下來的原因:nginx永遠不會啓動。

在腳本的最後,你必須運行nginx

#!/bin/bash 

echo running post install scripts for web..; 
cd /srv/myweb 
npm install 
composer self-update 
composer update 
nginx 

順便說一句,我建議你改變你的腳本並運行npm install且僅當需要(composer *update因此只如果有些文件在/ src目錄/ myweb不存在),因爲它使你的容器啓動時間徒勞無功。

請注意,通過這樣做,NginX將永遠不會捕獲由docker stop發送的SIGTERM信號。這可能會導致它突然死亡。

相反,如果您想確保nginx收到SIGTERM,則必須用exec nginx替換最後一行。這用nginx本身取代了bash過程。

+1

您需要將最後一行更改爲'exec nginx',這意味着您的bash腳本將被替換爲nginx,而不是產生新的進程。這是需要的,因此docker可以將SIGTERM等信號傳遞給nginx。更多信息,請訪問http://veithen.github.io/2014/11/16/sigterm-propagation.html – chadn

+0

非常好的一點。我將更新答案並添加您的建議。謝謝! – nessuno