Skip to content

Commit

Permalink
init
Browse files Browse the repository at this point in the history
  • Loading branch information
BertrandGouny committed Apr 13, 2018
1 parent 4d8704c commit ae0456d
Show file tree
Hide file tree
Showing 12 changed files with 343 additions and 1 deletion.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/.twgit_features_subject
/.twgit
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Changelog
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project follows MariaDB versioning.

## 10.2.14 - 2018-04-13
Initial release
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
The MIT License (MIT)

Copyright (c) 2018 Osixia

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
28 changes: 28 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
NAME = osixia/mariadb-helper
VERSION = 10.2.14

.PHONY: build build-nocache test tag-latest push push-latest release git-tag-version

build:
docker build -t $(NAME):$(VERSION) --rm image

build-nocache:
docker build -t $(NAME):$(VERSION) --no-cache --rm image

test:
env NAME=$(NAME) VERSION=$(VERSION) bats test/test.bats

tag-latest:
docker tag $(NAME):$(VERSION) $(NAME):latest

push:
docker push $(NAME):$(VERSION)

push-latest:
docker push $(NAME):latest

release: build test tag-latest push push-latest

git-tag-version: release
git tag -a v$(VERSION) -m "v$(VERSION)"
git push origin v$(VERSION)
17 changes: 16 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,16 @@
# mariadb-helper
# osixia/mariadb-helper

[![Docker Pulls](https://img.shields.io/docker/pulls/osixia/mariadb-helper.svg)][hub]
[![Docker Stars](https://img.shields.io/docker/stars/osixia/mariadb-helper.svg)][hub]
[![](https://images.microbadger.com/badges/image/osixia/mariadb-helper.svg)](http://microbadger.com/images/osixia/mariadb-helper "Get your own image badge on microbadger.com")

[hub]: https://hub.docker.com/r/osixia/mariadb-helper/

## Security
If you discover a security vulnerability within this docker image, please send an email to the Osixia! team at [email protected]. For minor vulnerabilities feel free to add an issue here on github.

Please include as many details as possible.

## Changelog

Please refer to: [CHANGELOG.md](CHANGELOG.md)
40 changes: 40 additions & 0 deletions image/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Use osixia/light-baseimage
# sources: https://github.com/osixia/docker-light-baseimage
FROM osixia/light-baseimage:1.1.1
MAINTAINER Bertrand Gouny <[email protected]>

# MariaDB version
ARG MARIADB_MAJOR=10.2
ARG MARIADB_VERSION=10.2.14+maria~stretch

# Add MariaDB repository
RUN apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xF1656F24C74CD1D8 \
&& echo "deb http://ftp.igh.cnrs.fr/pub/mariadb/repo/$MARIADB_MAJOR/debian stretch main" > /etc/apt/sources.list.d/mariadb.list \
&& { \
echo 'Package: *'; \
echo 'Pin: release o=MariaDB'; \
echo 'Pin-Priority: 999'; \
} > /etc/apt/preferences.d/mariadb
# add repository pinning to make sure dependencies from this MariaDB repo are preferred over Debian dependencie

# Add multiple process stack and ssl tools
# sources: https://github.com/osixia/docker-light-baseimage/blob/stable/image/tool/add-multiple-process-stack
# https://github.com/osixia/docker-light-baseimage/blob/stable/image/tool/add-service-available
#  https://github.com/osixia/docker-light-baseimage/blob/stable/image/service-available/:ssl-tools/download.sh
# Install MariaDB and xtrabackup
RUN apt-get -y update \
&& /container/tool/add-service-available :ssl-tools \
&& LC_ALL=C DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
mariadb-client=$MARIADB_VERSION \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# Add service directory to /container/service
ADD service /container/service

# Use baseimage install-service script
# https://github.com/osixia/docker-light-baseimage/blob/stable/image/tool/install-service
RUN /container/tool/install-service

# Add default env variables
ADD environment /container/environment/99-default
39 changes: 39 additions & 0 deletions image/environment/default.startup.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
MARIADB_HOST: mariadb

MARIADB_FROM_DATABASE: stable
MARIADB_TO_DATABASE: example-app-hotfix-0-1-19

MARIADB_TO_DATABASE_GRANT_USER: admin
MARIADB_TO_DATABASE_GRANT_USER_HOST: 127.0.0.1
MARIADB_TO_DATABASE_GRANT_PRIVILEGES: ALL

# Prefix MARIADB_FROM_DATABASE database with MARIADB_TO_DATABASE regex capture group
# example:
# MARIADB_FROM_DATABASE: stable
# MARIADB_TO_DATABASE: example-app-hotfix-0-1-19
# MARIADB_FROM_DATABASE_REGEX: (.*-)[feature|release|hotfix|demo].*
#
# MARIADB_FROM_DATABASE will becomes: example-app-stable
MARIADB_FROM_DATABASE_REGEX: "(.*-)[feature|release|hotfix|demo].*"

MARIADB_ROOT_USER: admin
MARIADB_ROOT_PASSWORD: admin

# ssl
MARIADB_SSL: true
MARIADB_SSL_CIPHER_SUITE: TLSv1.2

MARIADB_SSL_CRT_FILENAME: mariadb.crt
MARIADB_SSL_KEY_FILENAME: mariadb.key
MARIADB_SSL_CA_CRT_FILENAME: ca.crt

# ssl-helper environment variables prefix
MARIADB_SSL_HELPER_PREFIX: database # ssl-helper first search config from DATABASE_SSL_HELPER_* variables, before SSL_HELPER_* variables.

DSN_EXPORT_FILE:
DSN_EXPORT_VARIABLE_NAME:
DSN_HOST:
DSN_USER:
DSN_PASSWORD:
DSN_DATABASE:
DSN_ARGS:
25 changes: 25 additions & 0 deletions image/service/dsn-helper/startup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#!/bin/bash
set -o pipefail

# set -x (bash debug) if log level is trace
# https://github.com/osixia/docker-light-baseimage/blob/stable/image/tool/log-helper
log-helper level eq trace && set -x

if [ -n "${DSN_EXPORT_FILE}" ]; then

if [ -z "${DSN_EXPORT_VARIABLE_NAME}" ]; then
log-helper error "Error: DSN_EXPORT_VARIABLE_NAME must be set"
exit 1
fi

mkdir -p "$(dirname "${DSN_EXPORT_FILE}")" && touch "${DSN_EXPORT_FILE}"

DSN="${DSN_EXPORT_VARIABLE_NAME}=${DSN_USER}:${DSN_PASSWORD}@tcp(${DSN_HOST}:3306)/${DSN_DATABASE}${DSN_ARGS}"

log-helper debug "Export ${DSN} to ${DSN_EXPORT_FILE}"
echo "${DSN}" > ${DSN_EXPORT_FILE}
log-helper info "Done."

fi

exit 0
2 changes: 2 additions & 0 deletions image/service/mariadb-helper/assets/certs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Add your ssl server certificate, key and the CA certificate (if any) here
or during docker run mount a data volume with those files to /container/service/mariadb-helper/assets/certs
78 changes: 78 additions & 0 deletions image/service/mariadb-helper/startup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#!/bin/bash
set -o pipefail

# set -x (bash debug) if log level is trace
# https://github.com/osixia/docker-light-baseimage/blob/stable/image/tool/log-helper
log-helper level eq trace && set -x

if [ -z "${MARIADB_HOST}" ]; then
log-helper error "Error: MARIADB_HOST must be set."
exit 0
fi

if [ -z "${MARIADB_FROM_DATABASE}" ] || [ -z "${MARIADB_TO_DATABASE}" ]; then
log-helper error "Error: MARIADB_FROM_DATABASE and MARIADB_TO_DATABASE must be set."
exit 0
fi

if [ -z "${MARIADB_ROOT_USER}" ] || [ -z "${MARIADB_ROOT_PASSWORD}" ]; then
log-helper error "Error: MARIADB_ROOT_USER and MARIADB_ROOT_PASSWORD must be set."
exit 0
fi

MARIADB_SSL_CMD_ARGS=""

if [ "${MARIADB_SSL,,}" == "true" ]; then
log-helper info "SSL config..."

# generate a certificate and key with ssl-helper if MARIADB_SSL_CRT_FILENAME and MARIADB_SSL_KEY_FILENAME files don't exists
# https://github.com/osixia/docker-light-baseimage/blob/stable/image/service-available/:ssl-tools/assets/tool/ssl-helper
ssl-helper ${MARIADB_SSL_HELPER_PREFIX} "${CONTAINER_SERVICE_DIR}/mariadb-helper/assets/certs/$MARIADB_SSL_CRT_FILENAME" "${CONTAINER_SERVICE_DIR}/mariadb-helper/assets/certs/$MARIADB_SSL_KEY_FILENAME" "${CONTAINER_SERVICE_DIR}/mariadb-helper/assets/certs/$MARIADB_SSL_CA_CRT_FILENAME"

MARIADB_SSL_CMD_ARGS="--ssl --ssl-ca ${CONTAINER_SERVICE_DIR}/mariadb-helper/assets/certs/$MARIADB_SSL_CA_CRT_FILENAME --ssl-cert ${CONTAINER_SERVICE_DIR}/mariadb-helper/assets/certs/$MARIADB_SSL_CRT_FILENAME --ssl-key ${CONTAINER_SERVICE_DIR}/mariadb-helper/assets/certs/$MARIADB_SSL_KEY_FILENAME --ssl-cipher ${MARIADB_SSL_CIPHER_SUITE}"
fi

MARIADB_CMD_ARGS="-h${MARIADB_HOST} -u${MARIADB_ROOT_USER} -p${MARIADB_ROOT_PASSWORD} ${MARIADB_SSL_CMD_ARGS}"

log-helper info "Creating database ${MARIADB_TO_DATABASE} on host ${MARIADB_HOST}..."
mysqladmin ${MARIADB_CMD_ARGS} create ${MARIADB_TO_DATABASE}

CREATE_CMD_RESULT=$?

if [ $CREATE_CMD_RESULT -eq 255 ]; then
log-helper info "Database ${MARIADB_TO_DATABASE} already exists."
exit 0
elif [ $CREATE_CMD_RESULT -eq 0 ]; then
log-helper info "Database ${MARIADB_TO_DATABASE} created."

if [ -n "${MARIADB_TO_DATABASE_GRANT_USER}" ]; then
log-helper info "Grant user ${MARIADB_TO_DATABASE_GRANT_USER} permissions on database ${MARIADB_TO_DATABASE}..."
mysql ${MARIADB_CMD_ARGS} -e "GRANT ${MARIADB_TO_DATABASE_GRANT_PRIVILEGES} ON \`${MARIADB_TO_DATABASE}\`.* TO '${MARIADB_TO_DATABASE_GRANT_USER}'@'${MARIADB_TO_DATABASE_GRANT_USER_HOST}' ;" ${MARIADB_TO_DATABASE}
fi

if [ -n "${MARIADB_FROM_DATABASE_REGEX}" ]; then
log-helper debug "Use regex ${MARIADB_FROM_DATABASE_REGEX} on ${MARIADB_TO_DATABASE}"

if ! [[ ${MARIADB_TO_DATABASE} =~ ${MARIADB_FROM_DATABASE_REGEX} ]]; then
log-helper error "Enable to extract database name."
exit 1
else
MARIADB_FROM_DATABASE="${BASH_REMATCH[1]}${MARIADB_FROM_DATABASE}"
fi
fi

if [ "${MARIADB_FROM_DATABASE}" == "${MARIADB_TO_DATABASE}" ]; then
log-helper warning "MARIADB_FROM_DATABASE == MARIADB_TO_DATABASE == ${MARIADB_TO_DATABASE} copy aborted."
else
log-helper info "Copying database ${MARIADB_FROM_DATABASE} to ${MARIADB_TO_DATABASE}..."
mysqldump ${MARIADB_CMD_ARGS} --no-create-db --events --triggers --routines --compress ${MARIADB_FROM_DATABASE} | mysql ${MARIADB_CMD_ARGS} ${MARIADB_TO_DATABASE}
fi

else
log-helper info "Error."
exit 1
fi

log-helper info "Done."

exit 0
9 changes: 9 additions & 0 deletions test/test.bats
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/usr/bin/env bats
load test_helper

@test "image build" {

run build_image
[ "$status" -eq 0 ]

}
75 changes: 75 additions & 0 deletions test/test_helper.bash
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
setup() {
IMAGE_NAME="$NAME:$VERSION"
}

# function relative to the current container / image
build_image() {
#disable outputs
docker build -t $IMAGE_NAME $BATS_TEST_DIRNAME/../image &> /dev/null
}

run_image() {
CONTAINER_ID=$(docker run $@ -d $IMAGE_NAME -c "/container/service/mariadb/test.sh")
CONTAINER_IP=$(get_container_ip_by_cid $CONTAINER_ID)
}

start_container() {
start_containers_by_cid $CONTAINER_ID
}

stop_container() {
stop_containers_by_cid $CONTAINER_ID
}

remove_container() {
remove_containers_by_cid $CONTAINER_ID
}

clear_container() {
stop_containers_by_cid $CONTAINER_ID
remove_containers_by_cid $CONTAINER_ID
}

wait_process() {
wait_process_by_cid $CONTAINER_ID $@
}

# generic functions
get_container_ip_by_cid() {
local IP=$(docker inspect -f "{{ .NetworkSettings.IPAddress }}" $1)
echo "$IP"
}

start_containers_by_cid() {
for cid in "$@"
do
#disable outputs
docker start $cid &> /dev/null
done
}

stop_containers_by_cid() {
for cid in "$@"
do
#disable outputs
docker stop $cid &> /dev/null
done
}

remove_containers_by_cid() {
for cid in "$@"
do
#disable outputs
docker rm $cid &> /dev/null
done
}

clear_containers_by_cid() {
stop_containers_by_cid $@
remove_containers_by_cid $@
}

wait_process_by_cid() {
cid=$1
docker exec $cid /container/tool/wait-process ${@:2}
}

0 comments on commit ae0456d

Please sign in to comment.