From 1491dbfe862264a301157d4f98fd89188bd084b3 Mon Sep 17 00:00:00 2001 From: Andrey Arapov Date: Sat, 16 Jul 2016 18:09:54 +0200 Subject: [PATCH] initial commit --- Dockerfile | 55 ++++++++++++++++++++++++++++++++++++ README.md | 52 ++++++++++++++++++++++++++++++++++ service/fakeapp1/fakeapp1.sh | 16 +++++++++++ service/fakeapp1/log/run | 9 ++++++ service/fakeapp1/run | 5 ++++ service/fakeapp2/fakeapp2.sh | 16 +++++++++++ service/fakeapp2/log/run | 9 ++++++ service/fakeapp2/run | 5 ++++ service/fakeapp3/fakeapp3.sh | 13 +++++++++ service/fakeapp3/log/run | 13 +++++++++ service/fakeapp3/run | 4 +++ service/showlog/run | 12 ++++++++ 12 files changed, 209 insertions(+) create mode 100644 Dockerfile create mode 100644 README.md create mode 100755 service/fakeapp1/fakeapp1.sh create mode 100644 service/fakeapp1/log/run create mode 100755 service/fakeapp1/run create mode 100755 service/fakeapp2/fakeapp2.sh create mode 100644 service/fakeapp2/log/run create mode 100755 service/fakeapp2/run create mode 100755 service/fakeapp3/fakeapp3.sh create mode 100644 service/fakeapp3/log/run create mode 100755 service/fakeapp3/run create mode 100755 service/showlog/run diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..3cf6129 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,55 @@ +FROM centos:7 +MAINTAINER Andrey Arapov + +WORKDIR /root + +RUN yum -y update && \ + yum -y install make gcc glibc-static + +# Compile runit +# Deps: glibc-static +ENV RUNIT_NAME "runit-2.1.2" +ENV RUNIT_HASH "6fd0160cb0cf1207de4e66754b6d39750cff14bb0aa66ab49490992c0c47ba18" + +RUN pushd /opt && \ + curl -#L -o $RUNIT_NAME.tar.gz http://smarden.org/runit/$RUNIT_NAME.tar.gz && \ + sha256sum $RUNIT_NAME.tar.gz |grep -qw $RUNIT_HASH && \ + tar xf $RUNIT_NAME.tar.gz && \ + rm -f $RUNIT_NAME.tar.gz && \ + pushd admin/$RUNIT_NAME && \ + find . -xdev -type f -name "fmt_ptime.c" -exec sed -i.orig 's;gmtime;localtime;g' '{}' \; && \ + package/install && \ + package/install-man + + +# Compile socklog +ENV SOCKLOG_NAME "socklog-2.1.0" +ENV SOCKLOG_HASH "aa869a787ee004da4e5509b5a0031bcc17a4ab4ac650c2ce8d4e488123acb455" + +RUN pushd /opt && \ + curl -#L -o $SOCKLOG_NAME.tar.gz http://smarden.org/socklog/$SOCKLOG_NAME.tar.gz && \ + sha256sum $SOCKLOG_NAME.tar.gz |grep -qw $SOCKLOG_HASH && \ + tar xf $SOCKLOG_NAME.tar.gz && \ + rm -f $SOCKLOG_NAME.tar.gz && \ + pushd admin/$SOCKLOG_NAME && \ + package/install && \ + package/install-man + + +# runit-docker - painlessly use Runit in Docker containers +RUN curl -#L -o runit-docker.tar.gz https://github.com/pixers/runit-docker/archive/master.tar.gz && \ + tar xf runit-docker.tar.gz && \ + cd runit-docker-master/ && \ + make && \ + make install && \ + sed -i 's;runsvdir;runsvdir -P;g' /sbin/runit-docker + +ENV TZ "Europe/Amsterdam" +# RUN ln -svf /usr/share/zoneinfo/Europe/Amsterdam /etc/localtime + +COPY service /etc/service/ +RUN chmod +x -- /etc/service/*/run /etc/service/*/log/run + +ENTRYPOINT ["/sbin/runit-docker"] +VOLUME ["/var/log/fakeapp1", \ + "/var/log/fakeapp2"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..fc66eae --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +## show runit + +This container is to show how one can use runit, svlogd and socklog in order to log the service activity. + + +``` +$ docker run --rm -ti --name runit show-runit +/etc/service/showlog/run started +/etc/service/fakeapp3/log/run started +/etc/service/fakeapp2/log/run started +/etc/service/fakeapp1/log/run started +listening on /dev/log, gid=99, uid=99, starting. +2016-07-16_16:42:49.78418 [stdout] /etc/service/fakeapp1/fakeapp1.sh test: 1 ... +2016-07-16_16:42:51.77754 [stdout] /etc/service/fakeapp1/fakeapp1.sh test: 2 ... +2016-07-16_16:42:49.78307 [stdout] /etc/service/fakeapp2/fakeapp2.sh test: 1 ... +2016-07-16_16:42:49.78490 user.notice: Jul 16 16:42:49 /etc/service/fakeapp3/fakeapp3.sh: test: 1 ... +2016-07-16_16:42:51.78458 [stdout] /etc/service/fakeapp2/fakeapp2.sh test: 2 ... +2016-07-16_16:42:51.78676 user.notice: Jul 16 16:42:51 /etc/service/fakeapp3/fakeapp3.sh: test: 2 ... +2016-07-16_16:42:53.77904 [stdout] /etc/service/fakeapp1/fakeapp1.sh test: 3 ... +2016-07-16_16:42:53.78588 [stdout] /etc/service/fakeapp2/fakeapp2.sh test: 3 ... +2016-07-16_16:42:53.78935 user.notice: Jul 16 16:42:53 /etc/service/fakeapp3/fakeapp3.sh: test: 3 ... +2016-07-16_16:42:55.78062 [stdout] /etc/service/fakeapp1/fakeapp1.sh test: 4 ... +2016-07-16_16:42:55.78736 [stdout] /etc/service/fakeapp2/fakeapp2.sh test: 4 ... +2016-07-16_16:42:55.79176 user.notice: Jul 16 16:42:55 /etc/service/fakeapp3/fakeapp3.sh: test: 4 ... +``` + +## Build + +``` +docker build --ulimit nofile=1024:2048 -t show-runit . +``` + +## Use + +``` +docker run --rm -ti --name runit show-runit +``` + +``` +docker run -d -ti --name runit show-runit +docker logs -f runit +docker stop runit +docker start runit +``` + +``` +docker exec -ti runit bash +sv status /etc/service/* +sv stop /etc/service/fakeapp1 +sv start /etc/service/fakeapp1 +ls -la /var/log/fakeapp* +``` diff --git a/service/fakeapp1/fakeapp1.sh b/service/fakeapp1/fakeapp1.sh new file mode 100755 index 0000000..bc1e00e --- /dev/null +++ b/service/fakeapp1/fakeapp1.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +# fake app that logs something + +c=1 + +while true; do + # stdout log + echo "[stdout] $0 test: $c ..." + + # logger writes to syslog (/dev/log) + # logger -t $0 "test: $c ..." + + c=$(($c+1)) + sleep 2 +done diff --git a/service/fakeapp1/log/run b/service/fakeapp1/log/run new file mode 100644 index 0000000..66933b0 --- /dev/null +++ b/service/fakeapp1/log/run @@ -0,0 +1,9 @@ +#!/bin/sh +# file: fakeapp1/log/run + +# Collect all logs which come to stdout from the app +exec 2>&1 +echo $(realpath $0) started + +mkdir /var/log/fakeapp1 2>/dev/null +exec svlogd -tt /var/log/fakeapp1 diff --git a/service/fakeapp1/run b/service/fakeapp1/run new file mode 100755 index 0000000..7771b28 --- /dev/null +++ b/service/fakeapp1/run @@ -0,0 +1,5 @@ +#!/bin/sh +exec 2>&1 + +#exec sh -c "while true; do echo $0; sleep 1; done" +exec ./fakeapp1.sh diff --git a/service/fakeapp2/fakeapp2.sh b/service/fakeapp2/fakeapp2.sh new file mode 100755 index 0000000..bc1e00e --- /dev/null +++ b/service/fakeapp2/fakeapp2.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +# fake app that logs something + +c=1 + +while true; do + # stdout log + echo "[stdout] $0 test: $c ..." + + # logger writes to syslog (/dev/log) + # logger -t $0 "test: $c ..." + + c=$(($c+1)) + sleep 2 +done diff --git a/service/fakeapp2/log/run b/service/fakeapp2/log/run new file mode 100644 index 0000000..85adec2 --- /dev/null +++ b/service/fakeapp2/log/run @@ -0,0 +1,9 @@ +#!/bin/sh +# file: fakeapp2/log/run + +# Collect all logs which come to stdout from the app +exec 2>&1 +echo $(realpath $0) started + +mkdir /var/log/fakeapp2 2>/dev/null +exec svlogd -tt /var/log/fakeapp2 diff --git a/service/fakeapp2/run b/service/fakeapp2/run new file mode 100755 index 0000000..62d48c3 --- /dev/null +++ b/service/fakeapp2/run @@ -0,0 +1,5 @@ +#!/bin/sh +exec 2>&1 + +#exec sh -c "while true; do echo $0; sleep 1; done" +exec ./fakeapp2.sh diff --git a/service/fakeapp3/fakeapp3.sh b/service/fakeapp3/fakeapp3.sh new file mode 100755 index 0000000..24a9ed1 --- /dev/null +++ b/service/fakeapp3/fakeapp3.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +# fake app that logs something + +c=1 + +while true; do + # logger writes to syslog (/dev/log) + logger -t $0 "test: $c ..." + + c=$(($c+1)) + sleep 2 +done diff --git a/service/fakeapp3/log/run b/service/fakeapp3/log/run new file mode 100644 index 0000000..e17b451 --- /dev/null +++ b/service/fakeapp3/log/run @@ -0,0 +1,13 @@ +#!/bin/sh +# file: fakeapp3/log/run + +# Collect all logs which come to /dev/log (syslog) from the app +exec 2>&1 +echo $(realpath $0) started + +mkdir /var/log/fakeapp3 2>/dev/null + +# savelog -n -c 7 /var/log/fakeapp3/current +# exec sh -c "chpst -Unobody socklog unix /dev/log | tee -a /var/log/fakeapp3/current" + +exec sh -c "chpst -Unobody socklog unix /dev/log | svlogd -tt /var/log/fakeapp3" diff --git a/service/fakeapp3/run b/service/fakeapp3/run new file mode 100755 index 0000000..590bc8c --- /dev/null +++ b/service/fakeapp3/run @@ -0,0 +1,4 @@ +#!/bin/sh +exec 2>&1 + +exec ./fakeapp3.sh diff --git a/service/showlog/run b/service/showlog/run new file mode 100755 index 0000000..2a65dd8 --- /dev/null +++ b/service/showlog/run @@ -0,0 +1,12 @@ +#!/bin/sh +# file: showlog/run + +# Make the logs visible on `docker logs` command +exec 2>&1 +echo $(realpath $0) started + +# A little timeout is required, since svlogd moves current log to an archive, +# and only after that it starts logging to the "new" current log. +sleep 2 + +exec tail -fq /var/log/fakeapp*/current 2>/dev/null