2017-08-31 71 views
0

我最近已經將一個web服務移植到docker。正如標題中提到的,我遇到了一個奇怪的場景,當我使用docker run -dit運行它時,服務在後臺運行,但是當我使用docker-compose.yml時,服務退出。圖片使用docker run -dit正常運行,但使用docker stack deploy退出-c

更清晰,我有這個入口點在我Dockerfile:

ENTRYPOINT ["/data/start-service.sh"] 

這是start-service.sh的代碼:

#!/bin/bash 
/usr/local/bin/uwsgi --emperor=/data/vassals/ --daemonize=/var/log/uwsgi/emperor.log 
/etc/init.d/nginx start 
exec "[email protected]"; 

你可以看到,我只是在這個shell腳本中啓動uwsgi和nginx。最後一行(exec)只是讓腳本接受一個參數並保持運行。然後我運行這個使用:

docker run -dit -p 8080:8080 --name=web_server webserver /bin/bash 

如上所述,服務運行正常,我可以訪問web服務。

現在,我嘗試使用docker-compose.yml進行部署,但服務仍在退出/關閉。我試圖檢索日誌,但我沒有成功。我可以從中看到docker ps -a運行一秒鐘還是2(或3秒鐘),然後退出。

這裏是我的搬運工,compose.yml:

version: "3" 
services: 
    web_server: 
    image: webserver 
    entrypoint: 
     - /data/start-service.sh 
     - /bin/bash 
    ports: 
     - "8089:8080" 
    deploy: 
     resources: 
     limits: 
      cpus: "0.1" 
      memory: 2048M 
     restart_policy: 
      condition: on-failure 
    networks: 
     - webnet 

networks: 
    - webnet 

在YML文件入口點條目只是爲了確保start-service.sh腳本將與/斌/ bash作爲它的參數來跑,保持服務正常運行。但同樣,該服務關閉。

+0

你能提供這些命令的日誌嗎? '碼頭服務ls''碼頭服務日誌' – yamenk

+0

@yamenk - 謝謝你的回覆。我已經完成了這些命令,但是我沒有得到任何結果。既不在stdin/terminal也不在目前的工作目錄中的文件 – jaysonpryde

回答

1

bash將退出沒有適當的tty。由於您通過exec執行bash它變爲PID 1.每當PID 1退出容器停止。

要防止這種情況,請在撰寫文件中將tty: true添加到服務描述中。這與-tdocker run命令的做法基本相同。

+0

非常感謝!它解決了這個問題 – jaysonpryde