2017-11-29 24 views
1
私はドッキングウィンドウの画像にshellinaboxとRedisのを兼ね備えてい

を実行dockerfile cmdが、複数のコマンド

私Dockerfileは、単に以下の通りである:。

CMD ['/usr/local/work/scripts/run.sh'] 

ENTRYPOINT ["bin/bash"] 

EXPOSE 4200/tcp 

run.sh以下の通りである:

#!/bin/bash 
cd $REDIS_HOME 
src/redis-server 
/usr/bin/shellinaboxd -p 4200 

ドッカーが起動すると、両方ともredis serverとshellinaboxを起動します。で始動のみが開始されます。

私はドッカーを起動し、Ctrl + Cキーを押すとシェルビーボックスが開始されます。

「スーパーバイザー」の使い方を知っています。 誰もがシェルスクリプトの使い方を知っていますが、どちらもこの2つのサービスを開始しますか?

+0

'redis-server --daemonize yes'を試すことができます。これはバックグラウンドでredis-serverを起動するはずです。 – yamenk

答えて

0

ドッカー哲学では、コンテナごとに1つのプロセスが必要です。ドッカーの作成を使用して、1つはレディ、もう1つはシェルナボックスのコンテナを開始できます。

しかし、時にはそれが簡単またはいくつかの他の理由のためです:スクリプトシェル「のsrc /のRedisサーバ」打ち上げのRedisで

、それが停止されるまで、コンソールに接続したまま(例えばによって、Ctrl + Cで)、その後、 shellinaboxdを起動します。

この行 "src/redis-server"を "nohup src/redis-server &"に置き換えると、redisがforkプロセスで起動し、shellinaboxdが起動します。ドッキングウィンドウ・コンと

ソリューション:

version: '2' 
services: 
    redis: 
    build: ./Dockerfile 
    command: /usr/bin/src/redis-server 
    shellinabox: 
    build: ./Dockerfile 
    ports: 
     - 4200:4200 
    command: /usr/bin/shellinaboxd -p 4200 
0

あなたはentrypoint.shでバックグラウンドでのサービスを開始してはいけません! docker-stopコマンドは、SIGINTをコンテナのPID 1に送信して、シャットダウンできるようにします.10秒後に残りのプロセスに対してSIGKILLになります。 entrypoint.shに「トラップ」の部分がない限り、含まれているデータを簡単に破棄できます。

https://github.com/gdraheim/docker-systemctl-replacementで作業中にこれらの詳細について知りましたので、init-replacementとしても実行できます。このモードでは、CMD /usr/bin/systemctl.pyと言うだけで、有効化されたすべてのsystemDサービスはExecStartシーケンスが実行されます。ドッカー停止時に、ExecStopをクリーンシャットダウンのために実行させます。

これは、1つのコンテナで複数のサービスを実行する方法です。

関連する問題