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
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/*
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.adocTo 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 |
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)" ]
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" ]
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" ]
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
Tag and publish the image if the attribute publish is set when running the build.
-
publish: {publish}