NEWS
Debian Docker ioBroker
-
Hallo Zusammen,
ich versuche ,bisher ohne Erfolg, ioBroker im Docker Container auf einem PC mit aktuellem Debian zum laufen zu bekommen.
Der Container / die Config sieht wie folgt aus
docker run -d \ --name iobroker \ --network host --restart always \ -p 9081:8081 \ buanet/iobroker
Das Webinterface (IP-Server:9081) ist nicht zu erreichen.
Das Log sieht wie folgt aus
` > events.js:160
throw er; // Unhandled 'error' event
^
Error: listen EADDRINUSE 127.0.0.1:9000
at Object.exports._errnoException (util.js:1020:11)
at exports._exceptionWithHostPort (util.js:1043:20)
at Server._listen2 (net.js:1271:14)
at listen (net.js:1307:10)
at net.js:1417:9
at _combinedTickCallback (internal/process/next_tick.js:83:11)
at process._tickCallback (internal/process/next_tick.js:104:9)
rm: das Entfernen von '/var/run/dbus/pid' ist nicht möglich: Datei oder Verzeichnis nicht gefunden
Stopping Avahi mDNS/DNS-SD Daemon: avahi-daemon.
Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon.
Stopping Avahi mDNS/DNS-SD Daemon: avahi-daemon.
Process 28 died: No such process; trying to remove PID file. (/var/run/avahi-daemon//pid)
Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon.
… `
Jemand eine Idee woran es liegen könnte / was hier nicht stimmt?
-
Nun, das buanet/iobroker scheint einfach nicht für "normale" Systeme brauchbar zu sein und wohl nur für syno/qnap NAS einsetzbar.
Das Image athalis/iobroker:latest funktionierte direkt, auch wenn es etwas beschränkt ist was Optionen angeht (zb Volume ) da die Installscripte steif im Container unter /opt/ liegen. Zieht man sie vorher aus dem Image und legt sie externen Volume ab läuft auch dies einwandfrei. Mit der Option –Network host hat es wohl noch einige Probleme
-
> Nun, das buanet/iobroker scheint einfach nicht für "normale" Systeme brauchbar zu sein
Das kann ich so nicht bestätigen. Läuft bei mir auf einem Ubuntu 18.04 sowie einem Debian (aktuelles Image).Ich erzeuge das Image mit docker-compose weil ich da gleich noch mehr mit einbinde:
Ausschnitt aus dem docker-compose.yml:
version: '2' services: #iobroker iobroker: privileged: true stdin_open: true tty: true depends_on: - influxdb ports: - "1880:1880" #node-red - "1883:1883" #mqtt - "2001:2001" #homematic - "8081:8081" #iobroker admin - "8282:8282" #flot - "8088:8088" #terminal - "8284:8284" #socketIO devices: - "/dev:/dev" volumes: - ./iobroker:/opt/iobroker hostname: iobroker container_name: iobroker restart: always #image: myiob_n8 #nodejs v8 #image: myiob #nodejs v10 image: buanet/iobroker #nodejs v6
Die images für nodes v8/v10 hab ich selber gemacht, weil das originale baumet/iobroker derzeit v6 einsetzt.
-
Nachtrag:
Mit docker gehts natürlich genau so gut, nur die Syntax ist etwas anders.
Zu den Mappings:
devices: - "/dev:/dev"
sorgst dafür, das usb sticks(zigbee cc2531) in den container getappt wird. Wer will kann auch nur das konkrete device angeben, dann ist es etwas sicherer bzw, andere devices können für andere container gemappt werden.
- ./iobroker:/opt/iobroker
Mappt das Verzeichnis (<das_verzeichnis_in_dem_compose_ausgeführt_wird>/iobroker) als /opt/iobroker in den container.
Damit können alle iobroker-daten persistent im host liegen.
Das host-Verzeichnis sollte vorher angelegt sein und (falls vorhanden) einfach eine Kopie einer vorhandenen ioBroker-Installation sein. So hat man gleich alle seine Daten im Container. Es kann natürlich auch von einer frischen ioBroker installation übernommen werden.
Falls nötig kann man sich ein eigenes Image leicht selber machen mit````
docker buildBei mir z.B. so:
1. git reposity klonen
$ cd rwgit #einfach einverzeichnis, in das ich git-repos klone
original buanet/iobroker klonen
$ git clone https://github.com/buanet/docker-iobroker.git
$ cd docker-iobroker
2. dockerfile wie gewünscht editieren
Beispiel:
-
androit-tools weglassen
Z.7
RUN apt-get update && apt-get install -y build-essential python apt-utils curl avahi-daemon git libpcap-dev libavahi-compat-libdnssd-dev libfontconfig gnupg2 locales procps libudev-dev unzip sudo wget ffmpeg android-tools-adb android-tools-fastbootändern in:
RUN apt-get update && apt-get install -y build-essential python apt-utils curl avahi-daemon git libpcap-dev libavahi-compat-libdnssd-dev libfontconfig gnupg2 locales procps libudev-dev unzip sudo wget ffmpeg -
node/npm Version ändern
Z. 9
RUN curl -sL https://deb.nodesource.com/setup_6.x | bashändern in:
_6.x, _8.x for V6/8
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash
3. image erstellen
erstellt image: myiob:latest (den Punkt am Ende - bin im aktuellen Verzeichnis - nicht vergessen)
$ docker build -t myiob .
testen ob vorhanden:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myiob latest daac23213ff7 11 minutes ago 920MBDas erstellte Image wird dann einfach beim Docker-Befehl angegeben oder in der docker-compose.yml verwendet. Vorsicht mit nodejs V10.x, da gibt es(zumindest bei mir) diverse backup-Fehler.</das_verzeichnis_in_dem_compose_ausgeführt_wird>
-
-
> - ./iobroker:/opt/iobroker
mach meiner Meinung nach keinen Sinn da ich diese Option nutze um eben nicht die Standardpfade (mal davon ab das ich compose nicht nutze) zu nutzen.Ich möchte das die Nutzdaten des Containers auf meinem zfs-pool liegen.
docker run -d \ --name iobroker \ --restart always \ --hostname iobroker \ --privileged \ --volume=/pool0/docker/iobroker:/opt/iobroker \ --device /dev:/dev \ -e PUID=1008 \ -e PGID=1011 \ -p 9081:8081 \ -p 9082:8082 \ -p 2001:2001 \ buanet/iobroker
Diese Config führt zu folgendem log
` > Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon.Process 19 died: No such process; trying to remove PID file. (/var/run/avahi-daemon//pid9
Stopping Avahi mDNS/DNS-SD Daemon: avahi-daemon
Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon.
Process 19 died: No such process; trying to remove PID file. (/var/run/avahi-daemon//pid)
Stopping Avahi mDNS/DNS-SD Daemon: avahi-daemon.
Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon.
Process 22 died: No such process; trying to remove PID file. (/var/run/avahi-daemon//pid)
Stopping Avahi mDNS/DNS-SD Daemon: avahi-daemon.
Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon.
Process 19 died: No such process; trying to remove PID file. (/var/run/avahi-daemon//pid)
Stopping Avahi mDNS/DNS-SD Daemon: avahi-daemon.
Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon.
Process 22 died: No such process; trying to remove PID file. (/var/run/avahi-daemon//pid)
Stopping Avahi mDNS/DNS-SD Daemon: avahi-daemon. `
Lasse ich Volume weg
docker run -d \ --name iobroker \ --restart always \ --hostname iobroker \ --privileged \ --device /dev:/dev \ -e PUID=1008 \ -e PGID=1011 \ -p 9081:8081 \ -p 9082:8082 \ -p 2001:2001 \ buanet/iobroker
siehts nicht anders aus
` > Instance host changed for "system.adapter.admin.0" from "57eefb10ec7f" to "iobroker".
Instance host changed for "system.adapter.discovery.0" from "57eefb10ec7f" to "iobroker".
rm: das Entfernen von '/var/run/dbus/pid' ist nicht möglich: Datei oder Verzeichnis nicht gefunden
Stopping Avahi mDNS/DNS-SD Daemon: avahi-daemon.
Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon.
Process 33 died: No such process; trying to remove PID file. (/var/run/avahi-daemon//pid)
Stopping Avahi mDNS/DNS-SD Daemon: avahi-daemon.
Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon.
rocess 19 died: No such process; trying to remove PID file. (/var/run/avahi-daemon//pid)
Stopping Avahi mDNS/DNS-SD Daemon: avahi-daemon. `
-
> mach meiner Meinung nach keinen Sinn da ich diese Option nutze um eben nicht die Standardpfade (mal davon ab das ich compose
Nun ja, muss für dich ja keinen Sinn machen;-) ./iobroker ist halt der nur der path wo ich meine iob Daten ablege;-)
Bei dir ist das halt /pool0/docker/iobroker.
Und ich sagte ja schon, die gewünschte host-verzeichnisstuktur muss vorhanden sein inkl. aller Unterverzeichnisse.
-
/pool0/docker/iobroker existiert. Was genau heisst "inkl. aller Unterverzeichnisse." ?
Muss ich da selber die iobroker files ablegen? Von normalen Containern kenn ich es so dass das Volumen existieren muss das man mapped (in dem Fall /pool0/docker/iobroker) und der Inhalt wir beim ersten Containerstart durch den Container angelegt
-
/pool0/docker/iobroker existiert. Was genau heisst "inkl. aller Unterverzeichnisse." ?
Also ich bin jetzt noch nicht allzu lange mit ioB am Gange, deshalb kann es durchaus sein, das mein Halbwissen noch größer als mein Wissen ist;-)
Aber was ich so gesehen habe, legt ioB seine Bewegungsdaten (Scripte/logs/etc) in verschiedenen Verzeichnissen ab, die alle in /opt/iobroker oder tiefer innerhalb /opt/iobroker liegen. Deshalb kann ich unter Docker nicht einfach ein volume mouten, wo nur die Bewegungsdaten drin sind, sondern muss faktisch das komplette /opt/iobroker in den Container mounten. Da nimmt er dann aber auch alle Nichtbewegungsaden (module, adapter etc. her.) also fast alles. Deshalb muss in dem gemounteten Volume auch faktisch erstmal eine komplette ioB Installation sein, damit dort alle Unterverzeichnisse, module etc vorhanden sind.
Der docker-container ist dann eigentlich nur noch ne leere Hülle, (fast)alle eigentlichen Daten befinden sich dann im gemounteten hostLW. Nicht schön, aber wohl nicht zu ändern, wenn man die Bewegungsdaten auf dem host haben will.
Falls man keine ioB Installation hat, die man dann dem container zur Verfügung stellen kann, sollte man auch folgendermaßen vorgehen können:
1. erstelle einen container mit einem temporären Verzeichnis deiner Wahl.
z.B. –volume=~/tmp/iobroker:/tmp \ # ~/tmp/iobroker muss vorhanden sein
2. kopiere innerhalb des containers das komplette /opt/iobroker nach /tmp
$ docker exec -it iobroker /bin/bash # auf dem host
$ cp -r /opt/iobroker/ /tmp # innerhalb des containers
3. stoppe den container und lösche ihn
Auf dem host sollte sich in ~/tmp ein Verzeichnis iobroker mit allen Unterverzeichnissen befinden - quasi eine komplette ioB Installation.
4. kopiere das Unterverzeichnis iobroker aus ~/tmp inkl aller Unterverzeichnisse an die Stelle, die du als Volume monuten willst.
Bei dir wohl: /pool0/docker/
5. Erstelle einen neuen container, diesmal mit deinem Wunsch-Mount.
Die Punkte 1 - 5 hab ich nicht getestet, weil ich eine vorhandene ioB Installation 'gedockert' habe.
Eigentlich sollte es auch ohne das hostLW gehen (habe noch nicht getestet), aber dann sind halt auch die Bewegungsdaten innerhalb des containers.
Und nach docker rm wars das;-)
Ich kann damit ganz gut leben. Man hat damit eigentlich immer seine aktuellen Daten im Container, auch wenn man mal eben (z.B. um nodejs v10 zu testen) ein neues image kreiert.
Und was Docker-compose betrifft, das lernst du spätestens dann zu schätzen, wenn du mehrere container erzeugen willst, die voneinander abhängig sind.
Bei mir sind das: ioBroker, influxdb, chronograf, telegraf und grafana
Da reicht dann ein docker-compose up und alle container sind erstellt und arbeiten im gleichen netz. Und mit Docker-compose down sind alle container sauber gelöscht.
-
Den Weg mit dem kopieren der Files habe ich bei dem athalis Image erfolgreich genutzt.
Jedoch weder beim selbst erstellten noch beim buanet image bekommt man den container in einen Status das man überhaupt mit der Console drauf kann.
Der Container hängt in einer rebootschleife laut Portainer
-
> Der Container hängt in einer rebootschleife laut Portainer
Sry, mit Portainer kenne ich mich überhaupt nicht aus. Auf der normalen Debian Konsole hab ich es grad getestet:
(~/mytest muss vorhanden sein)
-
Nach der minimal-konfig deines Screenshots lässt sich auch mit dem selbst erstellten Image ein Container erzeigen und /opt/iobroker "rauskopieren"
~~![](</s><URL url=)<link_text text="download/file.php?id=36461&mode=view">https://forum.iobroker.net/download/file.php?id=36461&mode=view</link_text>" />
lege ich dann einen neuen Container an und mappe eben dieses kopierte Verzeichnis dort hinein füllt sich das log wieder mit diesen Meldungen der Beiträge vorher und ein Webinterface ist nicht erreichbar.~~
9508_bildschirmfoto_vom_2018-11-01_19-07-20.png -
ch glaube es lag daran dass ich die skripte im kopierten ordner noch einmal ausführbar machen musste (chmod +x).
Danach habe ich den Container nochmal mit -it statt -d angelegt und sieh da ich kann auf das Webinterace
-
> Danach habe ich den Container nochmal mit -it statt -d angelegt und sieh da ich kann auf das Webinterace
Ja, beim Live Container ganz wichtig. Das entspricht dem:
stdin_open: true tty: true
in meiner .yml
Sonst will er nicht.
-
Hallo,
ich hatte auch versucht selber ein Image zu erstellen und habe Probleme mit VOLUME !
So sieht mein Dockerfile aus:
–----------------------------------------------------
From debian:latest
Run apt update && apt upgrade -y
Run apt install sudo curl git ....
mkdir /opt/iobroker
workdir /opt/iobroker
run npm install iobroker ...
Expose 8081
Volume /opt/iobroker
Cmd["run.sh"]
–----------------------------------------------------
Image wird sauber erstellt.
Das Problem ist aber beim erstellen des Containers (docker run -d -v /share/iobroker:/opt/iobroker ...) werden keine Daten vom Image auf das Hostlaufwerk kopiert, habe somit ein leeres Verzeichnis.
Gibts da eine Möglichkeit das dies beim Erstellen des Containers automatisch funktioniert ? Habe ich was vergessen ?
-
> Das Problem ist aber beim erstellen des Containers (docker run -d -v /share/iobroker:/opt/iobroker …) werden keine Daten vom Image auf das Hostlaufwerk kopiert, habe somit ein leeres Verzeichnis.
Warum sollten Sie?Also etwas an Deinem Dockerfile fällt mir auf, wo ich nicht sicher bin, ob das so geht. Hat aber erstmal nichts mit dem kopieren zu tun.
mkdir /opt/iobroker
Sollte das nicht````
RUN mkdir...Was dein run.cmd macht weis ich nicht. Vlt. soll er bei dir ja da Kopieren. Ich mach es immer entweder manuell aus der Container shell.
#auf dem host
mkdir /share
docker run -it --rm -v /share/iobroker:/test --name testiob <mein_image> #mountet /share/iobroker als /test in den contaune#sollte jetzt auf dem container-prompt landen
cp -r /opt/iobroker/ /tmp
exit#sollte nun wieder auf dem hostprompt sein
~/var/iobroker sollte nun erstellt und gefüllt sein.</mein_image>Oder das ganze als Einzeiler:
docker run --rm -it -v /share/iobroker:/test --name testiob <mein_image> cp -r /share/iobroker /test</mein_image>
Danach kannst du deinen eigentlichen container erzeugen. Das Verzeichnis muss ja in Zukunft nicht mehr kopiert werden.z.B.
docker run -it -p 8081:8081 -p 1885:1885 -p 2001:2001 -p 8082:8082 -p 8084:8084 --privileged -v/share/iobroker:/opt/iobroker --name iobroker --restart=always <mein_image></mein_image>
Hoffe, ich hab das aus dem Gedächtnis ohne viele Fehler wiedergegeben. Die Ports und volumes musst du natürlich nach deinen Gegebenheiten anpassen.
-
#auf dem host
mkdir /share
docker run -it –rm -v /share/iobroker:/test --name testiob <mein_image>#mountet /share/iobroker als /test in den contaune
#sollte jetzt auf dem container-prompt landen
cp -r /opt/iobroker/ /tmp
exit
#sollte nun wieder auf dem hostprompt sein
~/var/iobroker sollte nun erstellt und gefüllt sein.
Das wird so nicht funktionieren: cp -r /opt/iobroker/ /tmp, du meintest eher cp -r /opt/iobroker/ /test ! Ja manuell kann man es so machen.
ja kann man so machen, wollte das aber vereinfachen, mir war nicht klar ob bei Angabe von VOLUME (...) automatisch kopiert wird oder nicht, aber so wie ich es gesehen habe geht das nicht. Schade, dann muss ich das per Script machen.</mein_image>
-
> du meintest eher cp -r /opt/iobroker/ /test
klar doch> VOLUME (…) automatisch kopier
Nein, beim -v wird nichts kopiert.> Schade, dann muss ich das per Script machen.
Wozu das? Du willst doch nicht etwas bei jedem docker run das volume kopieren?Eigentlich macht man das genau ein mal und dann nie wieder. Es sei denn, man will den Rechner neu aufsetzen. Es geht ja nur darum sozusagen als Initialzündung ein /opt/iobroker im Host zu haben. Danach werden ja alle Adpterinstallationen/konfigurationen usw. in diesem host-Verzeichnis gemacht. Das willst du sicher nicht alle Nase lang überschreiben.
-
Hallo,
wenn ich mich hier auch mal ranhängen darf.
rewenode, könntest du das mit dem iobroker und Docker nochmals genauer erklären.
Wie müsste ich vorgehen, damit ich meine aktuelle iobroker Installation in ein Docker Container bekomme.
Mir wäre es erstmal auch im prinzip egal ob native docker oder mit docker-compose gearbeitet wird.
docker-ce hab ich installiert.
Welche weiteren Schritte wären nötig?
Viele Grüße
Michael
-
` > rewenode, könntest du das mit dem iobroker und Docker nochmals genauer erklären.
Wie müsste ich vorgehen, damit ich meine aktuelle iobroker Installation in ein Docker Container bekomme.
Mir wäre es erstmal auch im prinzip egal ob native docker oder mit docker-compose gearbeitet wird. `
Mach ich gerne. Ich schau, dass ich das morgen hinbekomme. Entscheidend wäre noch, auf welcher Hardware (ARM/X86) du das Ganze laufen lassen willst und ob du deine bisherigen ioBroker-Daten behalten willst.
Falls du eine NAS einsetzt, kannst du meine Angaben nur sinngemäß verwenden. Die Dinger bringen i.d.R. eigene Docker-Admin Oberflächen mit, wo dann einige Dinge sicher anders konfiguriert werden.
Docker oder docker-compose ist wirklich völlig egal. Docker-compose ist dann von (großem) Vorteil, wenn du mehrere container erstellen willst, die zusammenarbeiten sollen/voneinander abhängig sind. Bei mir sind das zur Zeit: ioBroker+influxDB+chronograf+telegraf+grafana+portainer. Alle in Containern auf einem rock64 mit 4GB und SSD. In jedem Fall ist das keine Entscheidung entweder/oder. Du kannst ohne Weiteres beides gleichzeitig benutzen.
-
Wenn ich mich recht erinnere, steht in den Dockerfiles sowas drin:
WORKDIR /opt/iobroker RUN npm install iobroker --unsafe-perm && echo $(hostname) > .install_host RUN update-rc.d iobroker.sh remove
Das generiert im Image einen frisch installierten, "nackten" iobroker.
Ich wollte von einem Backup starten, und hab das ERSETZT mit:
# ... because we want to rebuild from backup WORKDIR / # Attention - docker will uncompress automatically! ADD total_dragon-2018_08_22-08_33_05_backupiobroker.tar.gz /
das Backup-File muss dann natürlich im gleichen Verzeichnis wie das Dockerfile liegen, den Namen muss man anpassen oder über ENV eingeben - war's mir damals nicht wert
Generiert dann im Container im /opt/iobroker Volume die Dateien vom Backup …
Muss man sich halt überlegen, wie mans haben will :), nur als Möglichkeit ...
CU