Merge branch 'release-0.2.0' into stable

This commit is contained in:
Bertrand Gouny 2016-01-27 14:01:05 +01:00
commit 27de0483fa
10 changed files with 193 additions and 97 deletions

View File

@ -1,5 +1,9 @@
# Changelog # Changelog
## 0.2.0
- Upgrade baseimage: light-baseimage:0.2.1
- Makefile with build no cache
## 0.1.9 ## 0.1.9
- Upgrade baseimage: light-baseimage:0.1.5 - Upgrade baseimage: light-baseimage:0.1.5

View File

@ -1,13 +1,16 @@
NAME = osixia/keepalived NAME = osixia/keepalived
VERSION = 0.1.9 VERSION = 0.2.0
.PHONY: all build test tag_latest release .PHONY: all build build-nocache test tag_latest release
all: build all: build
build: build:
docker build -t $(NAME):$(VERSION) --rm image docker build -t $(NAME):$(VERSION) --rm image
build-nocache:
docker build -t $(NAME):$(VERSION) --no-cache --rm image
test: test:
env NAME=$(NAME) VERSION=$(VERSION) bats test/test.bats env NAME=$(NAME) VERSION=$(VERSION) bats test/test.bats

126
README.md
View File

@ -1,19 +1,64 @@
# osixia/keepalived # osixia/keepalived
[![](https://badge.imagelayers.io/osixia/keepalived:latest.svg)](https://imagelayers.io/?images=osixia/keepalived:latest 'Get your own badge on imagelayers.io') [![](https://badge.imagelayers.io/osixia/keepalived:latest.svg)](https://imagelayers.io/?images=osixia/keepalived:latest 'Get your own badge on imagelayers.io') | Latest release: 0.2.0 - Keepalived 1.2.19 - [Changelog](CHANGELOG.md) | [Docker Hub](https://hub.docker.com/r/osixia/keepalived/) 
A docker image to run Keepalived. A docker image to run Keepalived.
> [keepalived.org](http://keepalived.org/) > [keepalived.org](http://keepalived.org/)
- [Quick start](#quick-start)
- [Beginner Guide](#beginner-guide)
- [Use your own Backup Manager config](#use-your-own-backup-manager-config)
- [Debug](#debug)
- [Environment Variables](#environment-variables)
- [Set your own environment variables](#set-your-own-environment-variables)
- [Use command line argument](#use-command-line-argument)
- [Link environment file](#link-environment-file)
- [Make your own image or extend this image](#make-your-own-image-or-extend-this-image)
- [Advanced User Guide](#advanced-user-guide)
- [Extend osixia/keepalived:0.2.0 image](#extend-osixiakeepalived020-image)
- [Make your own keepalived image](#make-your-own-keepalived-image)
- [Tests](#tests)
- [Under the hood: osixia/light-baseimage](#under-the-hood-osixialight-baseimage)
- [Changelog](#changelog)
## Quick start ## Quick start
This image require the kernel module ip_vs loaded on the host (`modprobe ip_vs`) and need to be run with : --cap-add=NET_ADMIN --net=host This image require the kernel module ip_vs loaded on the host (`modprobe ip_vs`) and need to be run with : --cap-add=NET_ADMIN --net=host
docker run --cap-add=NET_ADMIN --net=host -d osixia/keepalived docker run --cap-add=NET_ADMIN --net=host -d osixia/keepalived:0.2.0
## Beginner Guide
### Use your own Keepalived config
This image comes with a keepalived config file that can be easily customized via environment variables for a quick bootstrap,
but setting your own keepalived.conf is possible. 2 options:
- Link your config file at run time to `/container/service/keepalived/assets/keepalived.conf` :
docker run --volume /data/my-keepalived.conf:/container/service/keepalived/assets/keepalived.conf --detach osixia/keepalived:0.2.0
- Add your config file by extending or cloning this image, please refer to the [Advanced User Guide](#advanced-user-guide)
### Debug
The container default log level is **info**.
Available levels are: `none`, `error`, `warning`, `info`, `debug` and `trace`.
Example command to run the container in `debug` mode:
docker run --detach osixia/keepalived:0.2.0 --loglevel debug
See all command line options:
docker run osixia/keepalived:0.2.0 --help
## Environment Variables ## Environment Variables
Environement variables defaults are set in **image/env.yaml**. You can modify environment variable values directly in this file and rebuild the image ([see manual build](#manual-build)). You can also override those values at run time with -e argument or by setting your own env.yaml file as a docker volume to `/container/environment/env.yaml`. See examples below. Environment variables defaults are set in **image/environment/default.yaml**
See how to [set your own environment variables](#set-your-own-environment-variables)
- **KEEPALIVED_INTERFACE**: Keepalived network interface. Defaults to `eth0` - **KEEPALIVED_INTERFACE**: Keepalived network interface. Defaults to `eth0`
- **KEEPALIVED_PASSWORD**: Keepalived password. Defaults to `d0cker` - **KEEPALIVED_PASSWORD**: Keepalived password. Defaults to `d0cker`
@ -23,35 +68,76 @@ Environement variables defaults are set in **image/env.yaml**. You can modify en
- 192.168.1.10 - 192.168.1.10
- 192.168.1.11 - 192.168.1.11
If you want to set this variable at docker run command convert the yaml in python : If you want to set this variable at docker run command add the tag `#PYTHON2BASH:` and convert the yaml in python:
docker run -e KEEPALIVED_UNICAST_PEERS="[192.168.1.10', '192.168.1.11']" -d osixia/phpldapadmin docker run --env KEEPALIVED_UNICAST_PEERS="#PYTHON2BASH:['192.168.1.10', '192.168.1.11']" --detach osixia/keepalived:0.2.0
To convert yaml to python online : http://yaml-online-parser.appspot.com/ To convert yaml to python online : http://yaml-online-parser.appspot.com/
- **KEEPALIVED_VIRTUAL_IPS** Add a read only user. Defaults to : - **KEEPALIVED_VIRTUAL_IPS** Keepalived virtual IPs. Defaults to :
- 192.168.1.231 - 192.168.1.231
- 192.168.1.232 - 192.168.1.232
If you want to set this variable at docker run command convert the yaml in python, see above. If you want to set this variable at docker run command convert the yaml in python, see above.
- **KEEPALIVED_NOTIFY** Script to execute when node state change. Defaults to `/container/service/keepalived/assets/notify.sh` - **KEEPALIVED_NOTIFY** Script to execute when node state change. Defaults to `/container/service/keepalived/assets/notify.sh`
- **KEEPALIVED_COMMAND_LINE_ARGUMENTS** Keepalived command line arguments; Defaults to `--log-detail --dump-conf`
### Set environment variables at run time : ### Set environment variables at run time :
Environment variable can be set directly by adding the -e argument in the command line, for example : Environment variable can be set directly by adding the -e argument in the command line, for example :
docker run -e KEEPALIVED_INTERFACE="eno1" -e KEEPALIVED_PASSWORD="password!" \ docker run --env KEEPALIVED_INTERFACE="eno1" --env KEEPALIVED_PASSWORD="password!" \
-e KEEPALIVED_PRIORITY="100" -d osixia/keepalived --env KEEPALIVED_PRIORITY="100" --detach osixia/keepalived
Or by setting your own `env.yaml` file as a docker volume to `/container/environment/env.yaml` Or by setting your own `env.yaml` file as a docker volume to `/container/environment/env.yaml`
docker run -v /data/my-env.yaml:/container/environment/env.yaml \ docker run --volume /data/my-env.yaml:/container/environment/env.yaml \
-d osixia/keepalived --detach osixia/keepalived
### Set your own environment variables
#### Use command line argument
Environment variables can be set by adding the --env argument in the command line, for example:
docker run --env KEEPALIVED_INTERFACE="eno1" --env KEEPALIVED_PASSWORD="password!" \
--env KEEPALIVED_PRIORITY="100" --detach osixia/keepalived:0.2.0
#### Link environment file
For example if your environment file is in : /data/environment/my-env.yaml
docker run --volume /data/environment/my-env.yaml:/container/environment/01-custom/env.yaml \
--detach osixia/keepalived:0.2.0
Take care to link your environment file to `/container/environment/XX-somedir` (with XX < 99 so they will be processed before default environment files) and not directly to `/container/environment` because this directory contains predefined baseimage environment files to fix container environment (INITRD, LANG, LANGUAGE and LC_CTYPE).
#### Make your own image or extend this image
This is the best solution if you have a private registry. Please refer to the [Advanced User Guide](#advanced-user-guide) just below.
## Advanced User Guide
### Extend osixia/keepalived:0.2.0 image
If you need to add your custom TLS certificate, bootstrap config or environment files the easiest way is to extends this image.
Dockerfile example:
FROM osixia/osixia/keepalived:0.2.0
MAINTAINER Your Name <your@name.com>
ADD keepalived.conf /container/service/keepalived/assets/keepalived.conf
ADD environment /container/environment/01-custom
ADD scripts.sh /container/service/keepalived/assets/notify.sh
### Make your own keepalived image
## Manual build
Clone this project : Clone this project :
@ -61,12 +147,14 @@ Clone this project :
Adapt Makefile, set your image NAME and VERSION, for example : Adapt Makefile, set your image NAME and VERSION, for example :
NAME = osixia/keepalived NAME = osixia/keepalived
VERSION = 0.1.6 VERSION = 0.2.0
becomes : becomes :
NAME = billy-the-king/keepalived NAME = billy-the-king/keepalived
VERSION = 0.1.0 VERSION = 0.1.0
Add your custom scripts, environment files, config ...
Build your image : Build your image :
make build make build
@ -75,7 +163,7 @@ Run your image :
docker run -d billy-the-king/keepalived:0.1.0 docker run -d billy-the-king/keepalived:0.1.0
## Tests ### Tests
We use **Bats** (Bash Automated Testing System) to test this image: We use **Bats** (Bash Automated Testing System) to test this image:
@ -84,3 +172,13 @@ We use **Bats** (Bash Automated Testing System) to test this image:
Install Bats, and in this project directory run : Install Bats, and in this project directory run :
make test make test
### Under the hood: osixia/light-baseimage
This image is based on osixia/light-baseimage.
More info: https://github.com/osixia/docker-light-baseimage
## Changelog
Please refer to: [CHANGELOG.md](CHANGELOG.md)

View File

@ -1,23 +1,21 @@
FROM osixia/light-baseimage:0.1.5 # Use osixia/light-baseimage
# sources: https://github.com/osixia/docker-light-baseimage
FROM osixia/light-baseimage:0.2.1
MAINTAINER Bertrand Gouny <bertrand.gouny@osixia.net> MAINTAINER Bertrand Gouny <bertrand.gouny@osixia.net>
# Keepalived version # Keepalived version
ENV KEEPALIVED_VERSION 1.2.19 ENV KEEPALIVED_VERSION 1.2.19
# Use baseimage's init system. # Download, build and install Keepalived
# https://github.com/osixia/docker-light-baseimage/blob/stable/image/tool/run
CMD ["/container/tool/run"]
# Install Keepalived
RUN apt-get -y update \ RUN apt-get -y update \
&& LC_ALL=C DEBIAN_FRONTEND=noninteractive apt-get install -y \ && LC_ALL=C DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
curl \ curl \
make \ gcc \
gcc \ libnl-3-dev \
pkg-config \ libnl-genl-3-dev \
libssl-dev \ libssl-dev \
libnl-3-dev \ make \
libnl-genl-3-dev \ pkg-config \
&& curl -o keepalived.tar.gz -SL http://keepalived.org/software/keepalived-${KEEPALIVED_VERSION}.tar.gz \ && curl -o keepalived.tar.gz -SL http://keepalived.org/software/keepalived-${KEEPALIVED_VERSION}.tar.gz \
&& mkdir -p /container/keepalived-sources \ && mkdir -p /container/keepalived-sources \
&& tar -xzf keepalived.tar.gz --strip 1 -C /container/keepalived-sources \ && tar -xzf keepalived.tar.gz --strip 1 -C /container/keepalived-sources \
@ -39,4 +37,4 @@ RUN /container/tool/install-service \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Add default env variables # Add default env variables
ADD env.yaml /container/environment/env.yaml ADD environment /container/environment/99-default

View File

@ -14,3 +14,5 @@ KEEPALIVED_VIRTUAL_IPS:
- 192.168.1.232 - 192.168.1.232
KEEPALIVED_NOTIFY: /container/service/keepalived/assets/notify.sh KEEPALIVED_NOTIFY: /container/service/keepalived/assets/notify.sh
KEEPALIVED_COMMAND_LINE_ARGUMENTS: --log-detail --dump-conf

View File

@ -1,56 +0,0 @@
#!/bin/bash -e
FIRST_START_DONE="/etc/docker-keepalived-first-start-done"
# container first start
if [ ! -e "$FIRST_START_DONE" ]; then
ln -s /container/service/keepalived/assets/keepalived.conf /etc/keepalived/keepalived.conf
#
# bootstrap config
#
sed -i "s|{{ keepalived_interface }}|$KEEPALIVED_INTERFACE|g" /etc/keepalived/keepalived.conf
sed -i "s|{{ keepalived_priority }}|$KEEPALIVED_PRIORITY|g" /etc/keepalived/keepalived.conf
sed -i "s|{{ keepalived_password }}|$KEEPALIVED_PASSWORD|g" /etc/keepalived/keepalived.conf
if [ -n "$KEEPALIVED_NOTIFY" ]; then
sed -i "s|{{ keepalived_notify }}|notify \"$KEEPALIVED_NOTIFY\"|g" /etc/keepalived/keepalived.conf
else
sed -i "/{{ keepalived_notify }}/d" /etc/keepalived/keepalived.conf
fi
# unicast peers
KEEPALIVED_UNICAST_PEERS=($KEEPALIVED_UNICAST_PEERS)
for peer in "${KEEPALIVED_UNICAST_PEERS[@]}"
do
# it's just a peer
# stored in a variable
if [ -n "${!peer}" ]; then
sed -i "s|{{ keepalived_unicast_peers }}|${!peer}\n {{ keepalived_unicast_peers }}|g" /etc/keepalived/keepalived.conf
# directly
else
sed -i "s|{{ keepalived_unicast_peers }}|${peer}\n {{ keepalived_unicast_peers }}|g" /etc/keepalived/keepalived.conf
fi
done
sed -i "/{{ keepalived_unicast_peers }}/d" /etc/keepalived/keepalived.conf
# virtual ips
KEEPALIVED_VIRTUAL_IPS=($KEEPALIVED_VIRTUAL_IPS)
for vip in "${KEEPALIVED_VIRTUAL_IPS[@]}"
do
# it's just a peer
# stored in a variable
if [ -n "${!vip}" ]; then
sed -i "s|{{ keepalived_virtual_ips }}|${!vip}\n {{ keepalived_virtual_ips }}|g" /etc/keepalived/keepalived.conf
# directly
else
sed -i "s|{{ keepalived_virtual_ips }}|${vip}\n {{ keepalived_virtual_ips }}|g" /etc/keepalived/keepalived.conf
fi
done
sed -i "/{{ keepalived_virtual_ips }}/d" /etc/keepalived/keepalived.conf
touch $FIRST_START_DONE
fi
exit 0

View File

@ -1,2 +0,0 @@
#!/bin/bash -e
exec /usr/local/sbin/keepalived -f /etc/keepalived/keepalived.conf --dont-fork --log-console -D -d

View File

@ -0,0 +1,7 @@
#!/bin/bash -e
# 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
exec /usr/local/sbin/keepalived -f /etc/keepalived/keepalived.conf --dont-fork --log-console ${KEEPALIVED_COMMAND_LINE_ARGUMENTS}

View File

@ -0,0 +1,46 @@
#!/bin/bash -e
# 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
FIRST_START_DONE="${CONTAINER_STATE_DIR}/docker-keepalived-first-start-done"
# container first start
if [ ! -e "$FIRST_START_DONE" ]; then
#
# bootstrap config
#
sed -i --follow-symlinks "s|{{ keepalived_interface }}|$KEEPALIVED_INTERFACE|g" ${CONTAINER_SERVICE_DIR}/keepalived/assets/keepalived.conf
sed -i --follow-symlinks "s|{{ keepalived_priority }}|$KEEPALIVED_PRIORITY|g" ${CONTAINER_SERVICE_DIR}/keepalived/assets/keepalived.conf
sed -i --follow-symlinks "s|{{ keepalived_password }}|$KEEPALIVED_PASSWORD|g" ${CONTAINER_SERVICE_DIR}/keepalived/assets/keepalived.conf
if [ -n "$KEEPALIVED_NOTIFY" ]; then
sed -i --follow-symlinks "s|{{ keepalived_notify }}|notify \"$KEEPALIVED_NOTIFY\"|g" ${CONTAINER_SERVICE_DIR}/keepalived/assets/keepalived.conf
chmod +x $KEEPALIVED_NOTIFY
else
sed -i --follow-symlinks "/{{ keepalived_notify }}/d" ${CONTAINER_SERVICE_DIR}/keepalived/assets/keepalived.conf
fi
# unicast peers
for peer in $(complex-bash-env iterate KEEPALIVED_UNICAST_PEERS)
do
sed -i --follow-symlinks "s|{{ keepalived_unicast_peers }}|${!peer}\n {{ keepalived_unicast_peers }}|g" ${CONTAINER_SERVICE_DIR}/keepalived/assets/keepalived.conf
done
sed -i --follow-symlinks "/{{ keepalived_unicast_peers }}/d" ${CONTAINER_SERVICE_DIR}/keepalived/assets/keepalived.conf
# virtual ips
for vip in $(complex-bash-env iterate KEEPALIVED_VIRTUAL_IPS)
do
sed -i --follow-symlinks "s|{{ keepalived_virtual_ips }}|${!vip}\n {{ keepalived_virtual_ips }}|g" ${CONTAINER_SERVICE_DIR}/keepalived/assets/keepalived.conf
done
sed -i --follow-symlinks "/{{ keepalived_virtual_ips }}/d" ${CONTAINER_SERVICE_DIR}/keepalived/assets/keepalived.conf
touch $FIRST_START_DONE
fi
if [ ! -e "/etc/backup-manager.conf" ]; then
ln -sf ${CONTAINER_SERVICE_DIR}/keepalived/assets/keepalived.conf /etc/keepalived/keepalived.conf
fi
exit 0

View File

@ -83,19 +83,17 @@ is_service_running_by_cid() {
} }
is_file_exists_by_cid() { is_file_exists_by_cid() {
docker exec $1 cat "/etc/my_init_startup_files_completed" > /dev/null 2>&1 docker exec $1 cat $2 > /dev/null 2>&1
} }
wait_service_by_cid() { wait_service_by_cid() {
cid=$1 cid=$1
sleep 1
# first wait image init end # first wait image init end
while ! is_file_exists_by_cid $cid /etc/my_init_startup_files_completed while ! is_file_exists_by_cid $cid /container/run/state/startup-done
do do
sleep 1 sleep 0.5
done done
for service in "${@:2}" for service in "${@:2}"
@ -103,9 +101,7 @@ wait_service_by_cid() {
# wait service # wait service
while ! is_service_running_by_cid $cid $service while ! is_service_running_by_cid $cid $service
do do
sleep 1 sleep 0.5
done done
done done
sleep 5
} }