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):
Prüfen ob Image vorhanden ist:
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"
docker exec -it name_container /bin/bash
Beenden mit ‚exit‘.
