问题
I was wondering if someone has tried to build a cassandra docker image with default keyspace, I've tried to do it on BUILD time but it doesn't work because cassandra is not running in that phase. It was something similar to this:
FROM cassandra:2.0
COPY ../somewhere/keyspace_definition.txt /src/keyspace_definition.txt
RUN /usr/bin/cqlsh -f /src/keyspace_definition.txt
My new approach will be to do it from the entrypoint script, but, I wanted to now if someone else has a better idea.
Happy shipping :D
回答1:
Tackled this issue today. Build image, which overwrites default Cassandra docker-entrypoint.sh
with one modified, appended, right before exec "$@"
for f in docker-entrypoint-initdb.d/*; do
case "$f" in
*.sh) echo "$0: running $f"; . "$f" ;;
*.cql) echo "$0: running $f" && until cqlsh -f "$f"; do >&2 echo "Cassandra is unavailable - sleeping"; sleep 2; done & ;;
*) echo "$0: ignoring $f" ;;
esac
echo
done
Put the desired *.cql in image in docker-entrypoint-initdb.d/
.
Image will start, boot up the cassandra, and retries inserting to the database unless it succeeds. Just make sure your scripts are IF NOT EXISTS
otherwise the script will run indefinitely.
回答2:
Base on answers from @jan-oudrincky and @alexander-morozov, I build a new docker image which has a wrapper of original docker-entrypoint.sh
to create keyspace when environment variable CASSANDRA_KEYSPACE
is set. It will be useful in dev/test environment.
It doesn't modify docker-entrypoint.sh
so even if cassandra base image has any modification you just need a rebuild.
Dockerfile
FROM cassandra
COPY entrypoint-wrap.sh /entrypoint-wrap.sh
ENTRYPOINT ["/entrypoint-wrap.sh"]
CMD ["cassandra", "-f"]
entrypoint-wrap.sh
#!/bin/bash
if [[ ! -z "$CASSANDRA_KEYSPACE" && $1 = 'cassandra' ]]; then
# Create default keyspace for single node cluster
CQL="CREATE KEYSPACE $CASSANDRA_KEYSPACE WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 1};"
until echo $CQL | cqlsh; do
echo "cqlsh: Cassandra is unavailable - retry later"
sleep 2
done &
fi
exec /docker-entrypoint.sh "$@"
回答3:
I find it interesting that nobody responded to this yet. You can follow that they did with MySQL running in a container I supposed.
Refer to this link: http://www.luiselizondo.net/a-tutorial-on-how-to-use-mysql-with-docker/
Any script you put in that directory will be executed through the /entrypoint.sh script. Looks like Cassandra's entrypoint.sh script does not support this yet. However! It could!
回答4:
I'm using a Spring-Boot docker container to access my cassandra container. Everything is orchestrated by a dockr-compose. this tutorial in combination with the following code worked for me.
@Override
protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
CreateKeyspaceSpecification specification = CreateKeyspaceSpecification.createKeyspace(KEYSPACE);
return Arrays.asList(specification);
}
回答5:
I used this decisions. I deleted last line from file docker-entrypoint.sh and inserted in the end those lines:
exec "$@" > /dev/null &
sleep 30 && echo "CREATE KEYSPACE <YOUR_KEYSAPCE> WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 1};" | cqlsh > /dev/null && tail -n 10000 -f /var/log/cassandra/system.log
Then it's necessary to rebuild docker image.
来源:https://stackoverflow.com/questions/32254497/create-keyspace-automatically-inside-docker-container-with-cassandra