Riak in Docker
This asciibuild [1] file can be used to build a wide variety of variations of Docker containers for running a Riak cluster. It runs a single node per container instance and by setting the CLUSTER_COORDINATOR
environment variable to the IP address of a "master" node (the primary or seed node of a cluster), subsequent containers can be automatically joined into a cluster.
-
riak_version
: {riak_version} -
riak_flavor
: {riak_flavor} -
riak_tag
: {riak_tag} -
riak_explorer_version
: {riak_explorer_version} -
riak_client_version
: {riak_client_version}
-
openjdk
: set or unset Whether or not to include OpenJDK 8 -
docker
: set or unset Whether or not to include the Docker command-line tools -
riak_explorer
: set or unset Whether or not to include Riak Explorer -
riak_client
: set or unset Whether or not to include the Riak Python client
Create Image
FROM {{os_family}}:{{os_version}} ENV OS_FAMILY {{os_family}} ENV OS_VERSION {{os_version}} ENV RIAK_VERSION {{riak_version}} ENV RIAK_HOME {{riak_home}} ENV RIAK_FLAVOR KV RUN curl -s https://packagecloud.io/install/repositories/basho/{{riak_pkg}}/script.{{pkg_format}}.sh | bash # Expose default ports EXPOSE 8087 EXPOSE 8098 # Expose volumes for data and logs VOLUME /var/log/riak VOLUME /var/lib/riak # Install custom start script COPY riak-cluster.sh $RIAK_HOME/riak-cluster.sh RUN chmod a+x $RIAK_HOME/riak-cluster.sh # Install custom hooks COPY prestart.d /etc/riak/prestart.d COPY poststart.d /etc/riak/poststart.d # Prepare for bootstrapping schemas RUN mkdir -p /etc/riak/schemas WORKDIR /var/lib/riak CMD ["{{riak_home}}/riak-cluster.sh"] # Clean up APT cache RUN rm -rf /var/lib/apt/lists/* /tmp/*
Building the Image
This file is an asciibuild-enabled AsciiDoc file. It is also heavily parameterized in order to produce a wide variety of variations. Some of the variations possible include:
-
Riak KV
-
Based on
ubuntu:14.04
-
Based on
centos:7
-
-
Riak TS
-
Based on
ubuntu:14.04
-
Based on
centos:7
-
Based on
debian:8
-
-
Optional components (enabled or disabled based on the attributes set)
This asciibuild file will produce a riak_{riak_flavor} image based on {os_family}:{os_version}. Optional components included in this build:
To build the image using asciibuild
, process this README file:
asciibuild README.adoc
To change the variation of image produced, set attributes according to the following configuration matrix:
Attribute Value |
Produces |
|
Ubuntu Trusty image |
|
CentOS 7 image |
|
Turns off OpenJDK install |
|
Turns off Docker install |
|
Turns off Riak Explorer install |
|
Turns off Riak Python Client install |
Test Single Node
Validate the container is started by waiting for it to fully boot, then access the /stats
endpoint.
riak-admin wait-for-service riak_kv
function stats() { echo `curl -s localhost:8098/stats | jq -r '.vnode_gets'` } # There should be no read stats for an empty cluster [ "0" == "$(stats)" ] # Increment the read stats curl -s localhost:8098/types/default/buckets/notfound/keys/notfound # Wait for stats to be eventually-consistent sleep 1 # Verify read stats have incremented [ "3" == "$(stats)" ]
Test User Conf
To augment the riak.conf
file with additional settings, mount a user.conf
file into the /etc/riak/
directory. Each line should follow the pattern setting = value
. Each line will be split on the =
and made into a regex passed to sed
that matches the setting key and replaces the value with the value you specify in user.conf
.
# {{=<% %>=}} CONTAINER=$(docker run --label role=cluster -d -P -v `pwd`/test/user.conf:/etc/riak/user.conf <% riak_tag %>) docker exec $CONTAINER riak-admin wait-for-service riak_kv # Check that the backend was set to leveldb BACKEND=$(docker exec $CONTAINER riak config effective | egrep "^storage_backend" | cut -d= -f2 | tr -d ' ') [ "$BACKEND" == "leveldb" ]
Test Cluster
This Docker image has support for automatically creating a cluster by setting the environment variable COORDINATOR_NODE
to the IP address of a node to which you want to join when the container starts.
# {{=<% %>=}} # Discover coordinator node IP COORDINATOR_NODE=$(docker inspect -f {{.NetworkSettings.IPAddress}} <% riak_pkg %>) # Start new nodes for the cluster for i in 1 2; do CONTAINER=$(docker run -d --label=asciibuild.name="Riak in Docker" --label=role=cluster -e COORDINATOR_NODE=$COORDINATOR_NODE <% riak_tag %>) # Wait for node to completely start docker exec $CONTAINER riak-admin wait-for-service riak_kv done # Wait for cluster to settle some sleep 5 # Verify three nodes report up STATUS=$(docker exec <% riak_pkg %> riak-admin cluster status --format csv | tail -n 3 | cut -d, -f3) [ "$(echo $STATUS)" == "up up up" ]
Cleanup
Clean up temporary and transitory files that get rebuilt each time this build is run.
This step can be skipped by setting the attribute skip_clean
when running the build.
# Don't fail the build if cleanup doesn't happen set +e # Remove the Dockerfile we generate rm -Rf Dockerfile # Remove the cluster and other containers we started for tests for r in cluster schemas; do docker rm -f $(docker ps -aqf label=role=$r) || true done
Publish
Tag and publish the image if the attribute publish
is set when running the build.
-
publish
: {publish}