Docker检查数据库是否正在运行

entrypoint.sh包含需要Cassandra的各种cqlsh命令。 没有像script.sh这样的东西,cqlsh命令会失败,因为Cassandra没有足够的时间启动。 当我在本地执行以下操作时,一切似乎都正常工作。 但是,当我通过Docker运行时, script.sh永远不会结束。 换句话说, $status不会从1变为0。

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="$@" 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 

另外,我可以做些事情, until cqlsh -e 'some code'; do .. until cqlsh -e 'some code'; do .. ,如在这里指出的psql,但这似乎并没有为我工作。 想知道如何最好地解决这个问题。

您在Dockerfile中误用了RUN命令。 这不是用于启动服务,而是用于在映像中进行文件系统更改。 $status不更新的原因是因为无法通过RUN命令启动Cassandra。

您应该将service cassandra start/dir/scripts/entrypoint.sh添加到您的script.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