/riak-docker

Riak in Docker

Primary LanguageShell

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 docker

Variables to Set that influence the build
  • riak_version: {riak_version}

  • riak_flavor: {riak_flavor}

  • riak_tag: {riak_tag}

  • riak_explorer_version: {riak_explorer_version}

  • riak_client_version: {riak_client_version}

Variables for turning on or off components
  • 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

Riak Docker
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:

Docker Image Variations

This asciibuild file will produce a riak_{riak_flavor} image based on {os_family}:{os_version}. Optional components included in this build:

Optional Components

To build the image using asciibuild, process this README file:

Invoke Asciibuild
asciibuild README.adoc

To change the variation of image produced, set attributes according to the following configuration matrix:

Table 1. Alternative Configuration

Attribute Value

Produces

-a os_family=ubuntu -a os_version=14.04

Ubuntu Trusty image

-a os_family=centos -a os_version=7

CentOS 7 image

-a openjdk!

Turns off OpenJDK install

-a docker!

Turns off Docker install

-a riak_explorer!

Turns off Riak Explorer install

-a riak_client!

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.

Wait for riak_kv to start
riak-admin wait-for-service riak_kv
Check node Status
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.

Patch Configuration File
# {{=<% %>=}}
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.

Start additional Cluster Nodes
# {{=<% %>=}}
# 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.

Cleanup
# 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}