DNS Image and Container (PI)

Einführung

Erstellen eines Docker Images basierend auf Alpine. Beispiel: duckdns Image. Regelmäßiges senden der IP an duckdns. Beinhaltet Einbindung von scripts.

Voraussetzung

  • Raspberry Pi mit Raspbian OS
  • Docker
  • Docker-Compose

Image erstellen

Schritt 1

Erstellung einer dockerfile Datei. Lädt alpine als Basis Image. Erstellt ein Verzeichnis ‚/apps‘, wechselt in das Verzeichnis und kopiert die Dateien aus dem lokalen Unterverzeichnis ’scripts‘ in das ‚/app‘ Verzeichnis. Dockerfile erlaubt keine absoluten Pfadangaben, sondern benötigt immer relative Pfadangaben zum Speicherort des Dockerfiles. Installation von ‚bash‘ und ‚curl‘. Aufruf des Start Scripts mit den Parametern:

FROM alpine:latest
ENV subdomains=""
ENV domain=""
ENV token=""
ENV mail_domain=""
RUN mkdir /apps
WORKDIR /apps
COPY /scripts/ .
RUN apk add --no-cache bash curl
CMD ["sh", "-c", "/apps/entry.sh -d $domain -s $subdomains -t $token -m $mail_domain"] 

Die Datei ‚entry.sh‘:

#!/bin/sh
#parameter
# t = token
# d = domain
# s = subdomains comma separated
# m = mail domain
while getopts t:d:s: opt
do
	case $opt in
		t) token=$OPTARG;;
		d) domain=$OPTARG;;
		s) subdomains=$OPTARG;;
		m) mail_domain=$OPTARG;;
	esac
done
/apps/add_crontab.sh -d $domain -s $subdomains -t $token -m $mail_domain

# start cron
/usr/sbin/crond -f 

Die Datei ‚add_crontab.sh‘:

#!/bin/bash
#parameter
# t = token
# d = domain
# s = subdomains comma separated
# m = mail domain
while getopts t:d:s: opt
do
	case $opt in
		t) token=$OPTARG;;
		d) domain=$OPTARG;;
		s) subdomains=$OPTARG;;
		m) mail_domain=$OPTARG;;
	esac
done

#add cronjob to crontab - subdomains
command="/apps/provide_ip.sh -t $token -d $domain -s $subdomains >> /tmp/log_strato_dns.log 2>&1"
# command= $1 #folder as parameter for script
job="*/10 * * * * $command" # every 10 minutes
#To add it to the crontab, with no duplication:
cat <(fgrep -i -v "$command" <(crontab -l)) <(echo -e "$job \n") | crontab -

#add cronjob to crontab - mail domain
command="/apps/provide_ip_mail.sh -t $token -d $domain -m $mail_domain >> /tmp/log_strato_dns.log 2>&1"
# command= $1 #folder as parameter for script
job="*/10 * * * * $command" # every 10 minutes
#To add it to the crontab, with no duplication:
cat <(fgrep -i -v "$command" <(crontab -l)) <(echo -e "$job \n") | crontab -
 

Die Datei ‚provide_ip.sh‘:

#!/bin/bash
#parameter
# t = token
# d = domain
# s = subdomains comma separated
ip_addr=$(curl -s ifconfig.me) #  get public ip
echo "current ip: $ip_addr"
#
# strato update ip
# https://ihredomain.de:DynDNS-Passwort@dyndns.strato.com/nic/update?hostname=subdomain.ihredomain.de&myip=192.XXX.X.X,2003:8106:1234:5678:abcd:ef01:2345:6789
while getopts t:d:s: opt
do
	case $opt in
		t) token=$OPTARG;;
		d) domain=$OPTARG;;
		s) subdomains=$OPTARG;;
	esac
done

result_strato=$(curl -s "https://$domain:$token@dyndns.strato.com/nic/update?hostname=$subdomains&myip=$ip_addr")
echo "result: $result_strato" 

Die Datei ‚provide_ip_mail.sh‘:

#!/bin/bash
#parameter
# t = token
# d = domain
# m = mail domain
ip_addr=$(curl -s ifconfig.me) #  get public ip
echo "current ip: $ip_addr"
#
# strato update ip
# https://ihredomain.de:DynDNS-Passwort@dyndns.strato.com/nic/update?hostname=subdomain.ihredomain.de&myip=192.XXX.X.X,2003:8106:1234:5678:abcd:ef01:2345:6789&mx=mail-domain
while getopts t:d:m: opt
do
	case $opt in
		t) token=$OPTARG;;
		d) domain=$OPTARG;;
		m) mail_domain=$OPTARG;;
	esac
done

result_strato=$(curl -s "https://$domain:$token@dyndns.strato.com/nic/update?hostname=$mail_domain&myip=$ip_addr&mx=$mail_domain")
echo "result: $result_strato" 
Schritt 2

Ausführen des dockerfiles (Punkt am Ende nicht vergessen):

sudo docker build -f name_dockerfile – t name_image:nummer .

Prüfen ob Image vorhanden ist:

sudo docker images

Docker-compose:

version: "3"
services:
  strato_dns:
    image: strato_dns
    container_name: strato_dns
    restart: always
    environment:
        - token="73SolitonDNS"
        - domain=marc-zielonka.de
        - mail_domain=mail.marc-zielonka.de
        - subdomains="marc-zielonka.de,web.marc-zielonka.de,cloud.marc-zielonka.de,test-cloud.marc-zielonka.de,test-web.marc-zielonka.de"
 
Container starten:
sudo docker-compose -f name_docker_compose_file up -d
Im Container prüfen ob Skripte kopiert wurden:

docker exec -it name_container /bin/bash

Beenden mit ‚exit‘.