2017-03-12 21 views
0

entrypoint.shには、Cassandraを必要とするさまざまなcqlshコマンドが含まれています。 script.shのようなものがなければ、Cassandraには起動に時間がないため、cqlshコマンドは失敗します。ローカルで以下を実行すると、すべてが正しく動作するように見えます。しかし、Docker経由で実行すると、script.shは決して終了しません。言い換えれば、$statushereが述べたようにまた、私は、until cqlsh -e 'some code'; do ..ような何かを行うことができます1から0Docker DBが実行中であることを確認する

Dockerfile

FROM cassandra 
RUN apt-get update && apt-get install -y netcat 
RUN mkdir /dir 
ADD ./scripts /dir/scripts 
RUN /bin/bash -c 'service cassandra start' 
RUN /bin/bash -c '/dir/scripts/script.sh' 
RUN /bin/bash -c '/dir/scripts/entrypoint.sh' 

script.sh

#!/bin/bash 

set -e 
cmd="[email protected]" 

status=$(nc -z localhost 9042; echo $?) 
echo $status 

while [ $status != 0 ] 
do 
    sleep 3s 
    status=$(nc -z localhost 9042; echo $?) 
    echo $status 
done 

exec $cmd 

に変わることはありませんpsqlのために、それは私のために働くようには思われません。どのように問題に近づくのが最善か。

答えて

2

DockerfileでRUNコマンドを誤って使用しています。サービスを開始するのではなく、イメージ内でファイルシステムを変更するためのものです。 コマンドでCassandraを起動できないため、$statusが更新されないという理由があります。

あなたのscript.shファイルにservice cassandra start/dir/scripts/entrypoint.shを追加し、デフォルトで実行されますCMDことを確認する必要があります

Dockerfile

CMD ['/bin/bash', '-c', '/dir/scripts/script.sh'] 

script.sh

#!/bin/bash 

set -e 
# NOTE: I removed your `cmd` processing in favor of invoking entrypoint.sh 
# directly. 

# Start Cassandra before waiting for it to boot. 
service cassandra start 

status=$(nc -z localhost 9042; echo $?) 
echo $status 

while [ $status != 0 ] 
do 
    sleep 3s 
    status=$(nc -z localhost 9042; echo $?) 
    echo $status 
done 

exec /bin/bash -c /dir/scripts/entrypoint.sh 
+0

これは機能します。ヘルプをよろしくお願いいたします。 – datasci

関連する問題