Merge pull request #29 from ProviderNL/DockerImage

Docker image
thx for your work @JeroenBo !
This commit is contained in:
Thomas 2018-03-28 15:33:45 +02:00 committed by GitHub
commit e8673131b3
9 changed files with 235 additions and 4 deletions

29
docker/DOCKER.md Normal file
View file

@ -0,0 +1,29 @@
# Docker support
This is a updated version of the current docker support.
Container support is only for development purposes and should not be used in production without your own modificatins.
It's not needed to reload the container after you make changes in your current branch.
Images are currently not available in docker hub or other repository, so you have to build them yourself.
After a successful launch PowerDNS-Admin is reachable at http://localhost:9393
PowerDNS runs op port localhost udp/5353
## Basic commands:
### Build images
cd to this directory
```# ./build-images.sh```
### Run containers
Build the images before you run this command.
```# docker-compose up```
### Stop containers
```# docker-compose stop```
### Remove containers
```# docker-compose rm```

View file

@ -0,0 +1,42 @@
# PowerDNS-Admin
# Original from:
# https://github.com/ngoduykhanh/PowerDNS-Admin
#
# Initial image by winggundamth(/powerdns-mysql:trusty)
#
#
FROM alpine
MAINTAINER Jeroen Boonstra <jeroen [at] provider.nl>
ENV APP_USER=web APP_NAME=powerdns-admin
ENV APP_PATH=/home/$APP_USER/$APP_NAME
RUN apk add --update \
sudo \
python \
libxml2 \
xmlsec \
git \
python-dev \
py-pip \
build-base \
libxml2-dev \
xmlsec-dev \
libffi-dev \
openldap-dev \
&& adduser -S web
RUN sudo -u $APP_USER -H git clone --depth=1 \
https://github.com/thomasDOTde/PowerDNS-Admin $APP_PATH
RUN pip install -r $APP_PATH/requirements.txt
COPY docker-entrypoint.sh /docker-entrypoint.sh
USER $APP_USER
WORKDIR $APP_PATH
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["python", "run.py"]
EXPOSE 9393
VOLUME ["/var/log"]

View file

@ -0,0 +1,12 @@
#!/bin/sh
set -e
if [ "$WAITFOR_DB" -a ! -f "$APP_PATH/config.py" ]; then
cp "$APP_PATH/config_template_docker.py" "$APP_PATH/config.py"
fi
cd $APP_PATH && python create_db.py
# Start PowerDNS Admin
exec "$@"

View file

@ -0,0 +1,40 @@
# PowerDNS Authoritative Server with MySQL backend
# https://www.powerdns.com
#
# The PowerDNS Authoritative Server is the only solution that enables
# authoritative DNS service from all major databases, including but not limited
# to MySQL, PostgreSQL, SQLite3, Oracle, Sybase, Microsoft SQL Server, LDAP and
# plain text files.
FROM winggundamth/ubuntu-base:trusty
MAINTAINER Jirayut Nimsaeng <w [at] winginfotech.net>
ENV FROM_BASE=trusty-20160503.1
# 1) Add PowerDNS repository https://repo.powerdns.com
# 2) Install PowerDNS server
# 3) Clean to reduce Docker image size
ARG APT_CACHER_NG
COPY build-files /build-files
RUN [ -n "$APT_CACHER_NG" ] && \
echo "Acquire::http::Proxy \"$APT_CACHER_NG\";" \
> /etc/apt/apt.conf.d/11proxy || true; \
apt-get update && \
apt-get install -y curl && \
curl https://repo.powerdns.com/FD380FBB-pub.asc | apt-key add - && \
echo 'deb [arch=amd64] http://repo.powerdns.com/ubuntu trusty-auth-40 main' \
> /etc/apt/sources.list.d/pdns-$(lsb_release -cs).list && \
mv /build-files/pdns-pin /etc/apt/preferences.d/pdns && \
apt-get update && \
apt-get install -y pdns-server pdns-backend-mysql mysql-client && \
mv /build-files/pdns.mysql.conf /etc/powerdns/pdns.d/pdns.mysql.conf && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /etc/apt/apt.conf.d/11proxy /build-files \
/etc/powerdns/pdns.d/pdns.simplebind.conf
# 1) Copy Docker entrypoint script
COPY docker-entrypoint.sh /docker-entrypoint.sh
EXPOSE 53/udp 53 8081
VOLUME ["/var/log", "/etc/powerdns"]
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["/usr/sbin/pdns_server", "--guardian=yes"]

View file

@ -0,0 +1,3 @@
Package: pdns-*
Pin: origin repo.powerdns.com
Pin-Priority: 600

View file

@ -0,0 +1,6 @@
launch+=gmysql
gmysql-port=3306
gmysql-host=172.17.0.1
gmysql-password=CHANGEME
gmysql-user=powerdns
gmysql-dbname=powerdns

View file

@ -0,0 +1,89 @@
#!/bin/sh
# Author: Jirayut 'Dear' Nimsaeng
#
set -e
PDNS_CONF_PATH="/etc/powerdns/pdns.conf"
PDNS_MYSQL_CONF_PATH="/etc/powerdns/pdns.d/pdns.mysql.conf"
PDNS_MYSQL_HOST="localhost"
PDNS_MYSQL_PORT="3306"
PDNS_MYSQL_USERNAME="powerdns"
PDNS_MYSQL_PASSWORD="$PDNS_DB_PASSWORD"
PDNS_MYSQL_DBNAME="powerdns"
if [ -z "$PDNS_DB_PASSWORD" ]; then
echo 'ERROR: PDNS_DB_PASSWORD environment variable not found'
exit 1
fi
# Configure variables
if [ "$PDNS_DB_HOST" ]; then
PDNS_MYSQL_HOST="$PDNS_DB_HOST"
fi
if [ "$PDNS_DB_PORT" ]; then
PDNS_MYSQL_PORT="$PDNS_DB_PORT"
fi
if [ "$PDNS_DB_USERNAME" ]; then
PDNS_MYSQL_USERNAME="$PDNS_DB_USERNAME"
fi
if [ "$PDNS_DB_NAME" ]; then
PDNS_MYSQL_DBNAME="$PDNS_DB_NAME"
fi
# Configure mysql backend
sed -i \
-e "s/^gmysql-host=.*/gmysql-host=$PDNS_MYSQL_HOST/g" \
-e "s/^gmysql-port=.*/gmysql-port=$PDNS_MYSQL_PORT/g" \
-e "s/^gmysql-user=.*/gmysql-user=$PDNS_MYSQL_USERNAME/g" \
-e "s/^gmysql-password=.*/gmysql-password=$PDNS_MYSQL_PASSWORD/g" \
-e "s/^gmysql-dbname=.*/gmysql-dbname=$PDNS_MYSQL_DBNAME/g" \
$PDNS_MYSQL_CONF_PATH
if [ "$PDNS_SLAVE" != "1" ]; then
# Configure to be master
sed -i \
-e "s/^#\?\smaster=.*/master=yes/g" \
-e "s/^#\?\sslave=.*/slave=no/g" \
$PDNS_CONF_PATH
else
# Configure to be slave
sed -i \
-e "s/^#\?\smaster=.*/master=no/g" \
-e "s/^#\?\sslave=.*/slave=yes/g" \
$PDNS_CONF_PATH
fi
if [ "$PDNS_API_KEY" ]; then
# Enable API
sed -i \
-e "s/^#\?\sapi=.*/api=yes/g" \
-e "s!^#\?\sapi-logfile=.*!api-logfile=/dev/stdout!g" \
-e "s/^#\?\sapi-key=.*/api-key=$PDNS_API_KEY/g" \
-e "s/^#\?\swebserver=.*/webserver=yes/g" \
-e "s/^#\?\swebserver-address=.*/webserver-address=0.0.0.0/g" \
$PDNS_CONF_PATH
fi
if [ "$PDNS_WEBSERVER_ALLOW_FROM" ]; then
sed -i \
"s/^#\?\swebserver-allow-from=.*/webserver-allow-from=$PDNS_WEBSERVER_ALLOW_FROM/g" \
$PDNS_CONF_PATH
fi
MYSQL_COMMAND="mysql -h $PDNS_MYSQL_HOST -P $PDNS_MYSQL_PORT -u $PDNS_MYSQL_USERNAME -p$PDNS_MYSQL_PASSWORD"
until $MYSQL_COMMAND -e ";" ; do
>&2 echo "MySQL is unavailable - sleeping"
sleep 1
done
>&2 echo "MySQL is up - initial database if not exists"
MYSQL_CHECK_IF_HAS_TABLE="SELECT COUNT(DISTINCT table_name) FROM information_schema.columns WHERE table_schema = '$PDNS_MYSQL_DBNAME';"
MYSQL_NUM_TABLE=$($MYSQL_COMMAND --batch --skip-column-names -e "$MYSQL_CHECK_IF_HAS_TABLE")
if [ "$MYSQL_NUM_TABLE" -eq 0 ]; then
$MYSQL_COMMAND -D $PDNS_MYSQL_DBNAME < /usr/share/doc/pdns-backend-mysql/schema.mysql.sql
fi
# Start PowerDNS
exec "$@"

10
docker/build-images.sh Executable file
View file

@ -0,0 +1,10 @@
#!/usr/bin/env bash
IMAGES=(PowerDNS-MySQL PowerDNS-Admin)
for IMAGE in "${IMAGES[@]}"
do
echo building $(basename $IMAGE | tr '[A-Z]' '[a-z]')
cd $IMAGE
docker build -t $(basename $IMAGE | tr '[A-Z]' '[a-z]') .
cd ..
done

View file

@ -3,14 +3,14 @@ version: '2'
services:
powerdns-authoritative:
image: winggundamth/powerdns-mysql:trusty
image: powerdns-mysql
hostname: powerdns-authoritative
depends_on:
- powerdns-authoritative-mariadb
links:
- powerdns-authoritative-mariadb:mysqldb
ports:
- 172.17.0.1:53:53/udp
- 5553:53/udp
- 8081:8081
environment:
- PDNS_DB_HOST=mysqldb
@ -27,7 +27,7 @@ services:
- MYSQL_ROOT_PASSWORD=PowerDNSPassword
powerdns-admin:
image: winggundamth/powerdns-admin:trusty
image: powerdns-admin
hostname: powerdns-admin
depends_on:
- powerdns-admin-mariadb
@ -36,7 +36,7 @@ services:
- powerdns-admin-mariadb:mysqldb
- powerdns-authoritative:powerdns-server
volumes:
- ./:/home/web/powerdns-admin
- ../:/home/web/powerdns-admin
ports:
- 9393:9393
environment: