entrypoint.sh contiene varios comandos cqlsh que requieren Cassandra. Sin algo como script.sh , los comandos cqlsh fallan porque Cassandra no tiene suficiente tiempo para comenzar. Cuando ejecuto lo siguiente localmente, todo parece funcionar correctamente. Sin embargo, cuando ejecuto a través de Docker, script.sh nunca finaliza. En otras palabras, $status nunca cambia de 1 a 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 Alternativamente, podría hacer algo como until cqlsh -e 'some code'; do .. , como se indica aquí para psql, pero eso no parece funcionar para mí. Preguntándose cuál es la mejor manera de abordar el problema.
Está haciendo un mal uso del comando EJECUTAR en su RUN . No es para iniciar servicios, es para realizar cambios en el sistema de archivos de su imagen. La razón por la que $status no se actualiza es porque no puede iniciar Cassandra a través de un comando RUN .
Debe agregar service cassandra start y /dir/scripts/entrypoint.sh a su archivo script.sh , y convertirlo en el CMD que se ejecuta de manera predeterminada:
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