NGINX with syslog support in Docker

If you haven’t heard about Docker, this post will be of little interest, but if you also have started dockering-all-the-things you might have run into the limited log handling capabilities for Docker containers (Docker v0.8.0 is the current version at the time of writing), too. I especially noticed this when trying to run NGINX inside a container.

Being able to attach /dev/log of the host system to /dev/log inside a container (by adding a -v /dev/log:/dev/log parameter to docker run) made it seem like a quick fix - but only until you notice this hint in the NGINX docs:

Logging to syslog is available as part of our commercial subscription only.

Luckily there is an open source syslog patch for NGINX on GitHub. Below is a quick and dirty Dockerfile for an Ubuntu 13.10 container with a patched NGINX version.

There are a few things missing (e.g. NGINX php-fpm config, adding your application, actually configuring NGINX to use syslog), but you’ll probably figure that out.


# VERSION 0.0.1
#
# BUILD: docker build -rm -t dominik/nginx-syslog .
# RUN:   docker run -p $PORT:80 dominik/nginx-syslog
#        (logging via: -v /dev/log:/dev/log)

FROM ubuntu:13.10

RUN export DEBIAN_FRONTEND=noninteractive

RUN apt-get -y -qq update
RUN apt-get -y -qq upgrade
RUN apt-get -y -qq dist-upgrade

RUN apt-get -y --force-yes -qq install nginx \
                                       php5-dev \
                                       php5-fpm \
                                       php5-cli \
                                       php5-curl \
                                       php5-json \
                                       php-apc

# Patch Syslog support into nginx
RUN echo "deb-src http://archive.ubuntu.com/ubuntu saucy main universe" >> /etc/apt/sources.list
RUN echo "deb-src http://archive.ubuntu.com/ubuntu saucy-updates main universe" >> /etc/apt/sources.list
RUN echo "deb-src http://archive.ubuntu.com/ubuntu saucy-security main universe" >> /etc/apt/sources.list
RUN apt-get -y -qq update
RUN apt-get -y --force-yes -qq install build-essential dpkg-dev
RUN apt-get -y --force-yes -qq build-dep nginx
RUN mkdir /tmp/nginx; \
    mkdir /tmp/nginx/mod; \
    cd /tmp/nginx; \
    apt-get -y --force-yes -qq source nginx
ADD https://raw2.github.com/yaoweibin/nginx_syslog_patch/master/syslog_1.4.0.patch /tmp/nginx/mod/syslog_1.4.0.patch
ADD https://raw2.github.com/yaoweibin/nginx_syslog_patch/master/config /tmp/nginx/mod/config
RUN cd /tmp/nginx/nginx-1.4.1; \
    patch -p1 < ../mod/syslog_1.4.0.patch; \
    mv ./debian/rules ./debian/rules.original; \
    awk '/\$\(CONFIGURE_OPTS\)/{print "--add-module=/tmp/nginx/mod \\"}1' ./debian/rules.original > ./debian/rules; \
    dpkg-buildpackage -us -uc -nc; \
    cd ..; \
    dpkg -i nginx-common_1.4.1-3ubuntu1.1_all.deb nginx-full_1.4.1-3ubuntu1.1_amd64.deb; \
    rm -rf /tmp/nginx

# Add App
RUN mkdir /opt/app

# Configure php
RUN echo "cgi.fix_pathinfo = 1" >> /etc/php5/fpm/php.ini
RUN echo "output_buffering off" >> /etc/php5/fpm/php.ini
RUN echo "always_populate_raw_post_data off" >> /etc/php5/fpm/php.ini
RUN echo "magic_quotes_gpc = Off" >> /etc/php5/fpm/php.ini
RUN echo "mbstring.func_overload off" >> /etc/php5/fpm/php.ini
RUN echo "expose_php = Off" >> /etc/php5/fpm/php.ini
RUN echo "date.timezone = 'UTC'" >> /etc/php5/fpm/php.ini
RUN echo "date.timezone = 'UTC'" >> /etc/php5/cli/php.ini

EXPOSE 80

CMD service php5-fpm start && nginx

Any comments? Ping me on Twitter.