2016-10-04 10 views
3

私は他のアプリケーションを起動する前にデータベースが起動しているかどうかを確認するためにwait-for-itスクリプトを使用しています。succesfull wait-for-itスクリプトの後にドッカーコンテナを起動する方法

#!/bin/bash 

set -e 

host="$1" 
shift 
cmd="[email protected]" 

until psql -h "$host" -U "postgres" -c '\l'; do 
    >&2 echo "Postgres is unavailable - sleeping" 
    sleep 1 
done 

>&2 echo "Postgres is up - executing command" 
exec $cmd 

私は、このスクリプトhereを見つけました。 私のapp-containerは、MySQL is up - executing commandで実行を停止します。 スクリプトは成功しました(dbは実行中ですが)私のアプリケーションのドッカーファイルにある実際のCMD(スクリプトの後ろ)を実行する方法は私には分かりません。

これが私のdockerfileの終わりです:

COPY docker-entrypoint.sh /entrypoint.sh 
COPY ./wait-for-it.sh wait-for-it.sh 
ENTRYPOINT ["/entrypoint.sh"] 

EXPOSE 2368 
CMD ["npm", "start"] 
+0

'ENTRYPOINT'を削除し、両方を' CMD'に置くことができます: 'CMD /entrypoint.sh && npm start'。 –

+0

こんにちは、私はあなたが言ったが、それはまだ正常なpsqlのチェックの後でCMDのコマンドを実行することができないようだ。画像はビルドされ、ドッカーの作成はwait-for-itスクリプトを実行します。それは成功しているので、コンテナを起動できますが、間違っています。何も起こらない – DenCowboy

+0

私はwait-for-itスクリプトに引数が必要だと思います。 '/entrypoint.sh localhost npm start'を試してみてください。申し訳ありませんが、私はLinuxボックスを持っていないので、今はテストできません。返信いただきありがとうございます。 –

答えて

2

はのは、最初の物事のカップルをクリアしてみましょう。 DockerfileにENTRYPOINTCMDの両方を使用すると、CMDの値がパラメータとしてENTRYPOINTに渡されます。したがって、ファイルに現在ある内容は、

/entrypoint.sh npm start 

に変換されます。これは、コンテナの起動時に実行されます。 entrypoint.shで何が起こっているかわからないと、これにどのような影響があるかを知ることは難しいです。

あなたは以下の変更を作ることができるドッカー

、これを試してみてください。

  • DockerfileからENTRYPOINTを削除します。次へ
  • 変更CMD

    CMD /wait-for-it.sh localhost && /entrypoint.sh npm start 
    

ことをやって、以下を調整してください。

  • wait-for-it.shのパス - あなたはスクリプトをコピーしているどこに調節してくださいファイルをDockerfileに保存します。 entrypoint.shと同じフォルダにコピーすることをお勧めします。
  • wait-for-it.shスクリプトファイルの引数がlocalhostの場合は、データベースホストに置き換えてください。上記は、何

は、wait-for-it.shスクリプトを実行して、データベースが起動したら、次に、それはあなたがENTRYPOINTCMDに持っていた前のコマンドを実行します。それはあなたが現在持っているものに匹敵するはずです。

entrypoint.shスクリプトからwait-for-it.shスクリプトを呼び出して、追加の手順(npm startの待機スクリプトが成功すると)を実行することもできます。あなた次第...

ドッカー-作曲

あなたのコンテナを起動するためにドッカー-作曲を使用している場合は、コンテナがあなたのdocker-compose.yamlファイルにcommand属性を使用して起動するときに実行されるコマンドを上書きすることができます、例えば

command: > 
    bash -c " 

    /wait-for-it.sh localhost 
    && /entrypoint.sh npm start 
    " 

あなたが複数のラインを有するためにそれらが必要になります、引用符に

  • (この場合はBashの)選択のあなたのシェルを使用して複数のコマンドを起動するための

    • bash -cの使用に注意してください。

    この方法を使用すると、基本的に複数のコマンドをチェーン化してお互いに実行し、&&演算子を使用して組み合わせることができます。

    待ち、それは

    スクリプト

    ところで:私は、上記と同様に良好な結果と同様の目的のために、このwait-for-it scriptを使用します。これはあなたのバージョンよりもはるかに堅牢で、ほとんどすべてのホスト/ポートの組み合わせをサポートしています。 MySQLを待つのに使っています。あなたの質問は、MySQLかPostgreSQLかどうかは明らかではありません。

  • +0

    私はmysqlを使用していますが、スクリプトはドッカーのドキュメントからコピーされますが、mysqlとうまく動作するようになっています。私もドッカーで作成を開始しようとするので、まだドッカーファイルを編集する必要はありますか? – DenCowboy

    +0

    私はDocker-Composeに関するセクションで答えを更新しました – nwinkler

    関連する問題