NEWS
USB in Docker via neuer Container über Compose u.a. andere
-
fast
wenn man docker dann mal einigermaßen durchdrungen hat, mag man auf einem host gar keine applikationen mehr anders installieren.
stell dir vor morgen kommt ein betriebssystem update und du hast wirklich alle deine anwendungen in docker container virtualisiert.
dann hast du da keine individuell nachinstallierten pakete mehr, keine manuellen cron einträge
oder gar irgendwelche systemd/init start prozeduren, die du mal eingerichtet hast, dich aber nicht mehr daran erinnern kannst.
dann wird der os upgrade wie ein klax, weil du ja nur noch docker wieder installieren musst, deine sicherung zurückspielen und dann alle container neu generierst und zack läuftoder man installiert mal kurz einen test iobroker mit der nächsten alpha/beta version ohne gefahr seine produktion zu serstören inklusive den vorteil das dann rückstandsfrei wieder entfernen zu können
mittlerweile gibt es auch container mit grafischer benutzeroberfläche, da verbindest du dich dann per browser, da läuft dann irgendein rdp oder vnc. hier ein beispie für ubuntu
https://hub.docker.com/r/dorowu/ubuntu-desktop-lxde-vnc -
@oliverio und zack, asterisk container auch config persistent ausverlagert. (Leider gehen tel-anrufe noch nicht, weil hier wohl die installation der anderen linux-pakete in diesem andrius image gar nicht installiert werden, die option über
environment: - PACKAGES=ffmpeg lame sox libsox-fmt-mp3
scheint wohl dieser container gar nicht zu unterstützen, wie krieg ich denn da jetzt die linux-pakete rein, das ist wohl die qudratur des kreises: auf den asterisk-container bin ich gewechsel, da in iobroker das linux-paket nicht installiert werden kann, jetzt aber kann ich dort die anderen pakete nicht mehr installieren....)
Ansonsten, ja klar die Docker-Technik hat wirklich was, also alles was ich jetzt so auf meiner Synology betreibe läuft mittlerweile in containern, das host-system von synology ist ja kein reines linux mehr, die haben das ziemlich verbogen, auch kein apt paket-manager,...
Auf meinem Hauptrechner bin ich halt immer noch auf windows unterwegs, in der windows-welt ist die docker-technik noch nicht angekommen, man könnte ja da parallel noch eine vm oder wsl2 draufmachen und dort dann mit dockern arbeiten....
-
ok, auch das geht, allerdings wird es nun ein wenig komplexer.
bisher hast du das image nach einer vorlage von andrius generieren lassen.
gemäß der beschreibung bei dockerhub schreibt erWhat's missing
Only base Asterisk packages installed. If you want to add sounds, it's recommended to mount them as volume or data container, however you may install additional packages with apk command:asterisk-alsa - ALSA channel;
asterisk-cdr-mysql - MySQL CDR;
asterisk-chan-dongle - chan_dongle, to manage calls and SMS through Huawei USB dongle;
asterisk-curl - curl integration with Asterisk;
asterisk-dahdi - DAHDI channel (ISDN BRI/PRI, FXO and FXS cards integration);
asterisk-fax - support faxing
asterisk-mobile - Use Bluetooth mobile phones as FXO devices;
asterisk-odbc - ODBC support;
asterisk-pgsql - PostgreSQL support;
asterisk-sounds-en - sounds
asterisk-sounds-moh - music on hold;
asterisk-speex - Speex codec;
asterisk-srtp - SRTP encryption;
asterisk-tds - MS SQL support.das heißt nun, das wir auf basis sein dockerfiles dieses ein wenig erweitern müssen um die anderen pakete noch installiert zu bekommen.
nutzt du jetzt portainer oder synology für die dockerverwaltung?
-
@oliverio said in USB in Docker via neuer Container über Compose u.a. andere:
nutzt du jetzt portainer oder synology für die dockerverwaltung?
Bis vor kurzem nutzte ich DSM-Gui von Synology, aber seit ihr mir hier das docker-compose verfahren nahelegt habt, bin ich auf portainer umgestiegen (das unterstützt m.W. Synology gar nicht), also ja: portainer.
-
ok, hier bin ich nicht ganz so firm.
aber lese dir mal die beschreibung durch.
https://docs.portainer.io/user/docker/images/buildin einem dockerfile stehen die anweisungen drin, wie ein image genau erstellt wird.
im folgenden verzeichnis gibt es 2 relevante dateien dockerfile und docker-entrypoint
https://github.com/andrius/asterisk/tree/master/alpineziel ist es, das dockerfile aus diesem verzeichnis zu kopieren und so zu erweitern, das deine weiteren pakete noch installiert werden.
leider hat der ersteller so etwas nicht vorgesehen, wie es bei iobroker mit der packages environment variable ist.
daher muss man das selbst eintragen. dürfte aber nicht wirklich so komplex sein.die datei docker-entrypoint ist eigentlich nur eine shell-datei, die ausgeführt wird, sobald die erstellung des images fertig ist, dort werden dann noch ein paar weitere schritte durchgeführt.
# vim:set ft=dockerfile: FROM <%= docker_baseimage %> LABEL maintainer="Andrius Kairiukstis <k@andrius.mobi>" ENV LANG=C.UTF-8 ENV LC_ALL C.UTF-8 RUN set -e \ && apk add --update --quiet \ asterisk \ asterisk-sample-config >/dev/null \ && asterisk -U asterisk &>/dev/null \ && sleep 5s \ && [ "$(asterisk -rx "core show channeltypes" | grep PJSIP)" != "" ] && : \ || rm -rf /usr/lib/asterisk/modules/*pj* \ && pkill -9 ast \ && sleep 1s \ && truncate -s 0 \ /var/log/asterisk/messages \ /var/log/asterisk/queue_log || : \ && mkdir -p /var/spool/asterisk/fax \ && chown -R asterisk: /var/spool/asterisk \ && rm -rf /var/run/asterisk/* \ /var/cache/apk/* \ /tmp/* \ /var/tmp/* EXPOSE 5060/udp 5060/tcp VOLUME /var/lib/asterisk/sounds /var/lib/asterisk/keys /var/lib/asterisk/phoneprov /var/spool/asterisk /var/log/asterisk ADD docker-entrypoint.sh /docker-entrypoint.sh ENTRYPOINT ["/docker-entrypoint.sh"]
interessant sind hier die befehle in zeile 10-12
apk add ist der alpine befehl um pakete zu installieren
wenn du das -Zeichen siehst, dann bedeutet das, das es zu einem Befehl gehört aber in der nächsten zeile weitergeht. Der Befehl endet immer mit &&, was nix anders als eine Verknüpfung ist. Zeile 9-27 ist eigentlich alles eine Anweisung, die auf einmal losgeschickt wird und dann vom Betriebssystem der Reihe nach abgearbeitet wird.Also Zeile 10-12 muss jetzt so erweitert werden, das deine weiteren Pakete da noch ergänzt werden. Am besten je Zeile eines. Die Ergänzung müsste dann so aussehen
ffmpeg / lame / sox / libsox-fmt-mp3
Die Environment variable PACKAGES kannst aus der docker-asterix wieder herausnehmen. Die wird eh nicht beachtet.
in diesem dockerfile musst du noch
FROM <%= docker_baseimage %>
gegen
FROM alpine:latest
ersetzen, da der Ersteller diese Datei verwendet um ganz viele images zu erzeugen und es nochmal in einem script verarbeitet wird. -
@oliverio Ok, danke. Also, mal wieder "nur" ein Teilerfolg, 2 Probleme:
1.) Das Paket "libsox-fmt-mp3" konnte er nicht finden beim image erstellen, als ich das rauslöschte, hat es funktioniert, also container wurde erstellt. Ich habe auch das file "docker-entrypoint" mit in die container-erstellung geladen
2.) als ich dann (mit dem neuen Image) den neuen stack mit docker-compose bauen wollte, kam diese Fehlermeldung:
Probleme scheint gerade das docker-entrypoint file zu machen. Lt. deiner Beschreibung wird das bei image Erstellung ausgeführt und nicht später bei Container-erstellung.Ok, muss morgen dann weiter schauen...
-
@chrisham
Das Script wird ja mit im filesystem des containers mit integriert und dann gestartet.
Evtl müsste man dem den User und der Gruppe Root zuordnen
Aber ich kann tagsüber mal nochmal schauen -
@chrisham
Die Datei wird ja in das Dateisystem des Containers integriert. Evtl muss man dem den User und Gruppe Root zuordnen.Das Paket in dem die Datei enthalten ist heißt sox
https://pkgs.alpinelinux.org/contents?branch=edge&name=sox&arch=armhf&repo=communitySox hast du ja drin, dann war das früher schon falsch
-
@chrisham said in USB in Docker via neuer Container über Compose u.a. andere:
Probleme scheint gerade das docker-entrypoint file zu machen
es scheint wohl daran zu liegen, das der datei das execution flag fehlt.
ich habe gesehen, das im portainer nur dateien vom client rechner (also windows) hochgeladen werden können. da ist wahrscheinlich das flag nicht gesetzt. daher muss man es dann im dockerfile setzen
die zeile kommt zwischen der ADD und der ENTRYPOINT Zeile
Falls da auch was nicht funktioniert, mach noch ein / vor den DateinamenRUN chmod +x docker-entrypoint.sh
-
@oliverio ok, perfekt, das image wurde erfolgreich gebaut und auch der neu docker-stack basierend auf diesem image.
Die Telefonfunktion vom asterisk läuft allerdings immer noch nicht, immer noch die gleichen Fehler.
Was mich allerdings wundert: in dem docker-file von andrius steht jetzt wieder port 5060 drin:EXPOSE 5060/udp 5060/tcp
Was allerdings seltsam ist, denn ich habe im Asterisk-IOBroker-Adapter ja 5038 drin und der Adapter verbindet auch.
Dennoch versuche ich es nochmals alles konsistent mit dem gleichen Port zu machen, um diese Fehlerquelle auf jeden Fall ausschließen zu können. -
@chrisham btw, das war das log-file vom image-build:
Step 1/10 : FROM alpine:latest ---> 8ca4688f4f35 Step 2/10 : LABEL maintainer="Andrius Kairiukstis <k@andrius.mobi>" ---> Using cache ---> 80d70b682d6f Step 3/10 : ENV LANG=C.UTF-8 ---> Using cache ---> c2ab84f9a8a9 Step 4/10 : ENV LC_ALL C.UTF-8 ---> Using cache ---> 05efc4fd9d07 Step 5/10 : RUN set -e && apk add --update --quiet asterisk asterisk-sample-config >/dev/null ffmpeg lame sox && asterisk -U asterisk &>/dev/null && sleep 5s && [ "$(asterisk -rx "core show channeltypes" | grep PJSIP)" != "" ] && : || rm -rf /usr/lib/asterisk/modules/*pj* && pkill -9 ast && sleep 1s && truncate -s 0 /var/log/asterisk/messages /var/log/asterisk/queue_log || : && mkdir -p /var/spool/asterisk/fax && chown -R asterisk: /var/spool/asterisk && rm -rf /var/run/asterisk/* /var/cache/apk/* /tmp/* /var/tmp/* ---> Using cache ---> c1549981d129 Step 6/10 : EXPOSE 5060/udp 5060/tcp ---> Using cache ---> d9a50fc83bdc Step 7/10 : VOLUME /var/lib/asterisk/sounds /var/lib/asterisk/keys /var/lib/asterisk/phoneprov /var/spool/asterisk /var/log/asterisk ---> Using cache ---> 21c0dffb3708 Step 8/10 : ADD docker-entrypoint.sh /docker-entrypoint.sh ---> Using cache ---> f57c57d310c7 Step 9/10 : RUN chmod +x docker-entrypoint.sh ---> Running in 33be21150960 Removing intermediate container 33be21150960 ---> 5b4dc32de023 Step 10/10 : ENTRYPOINT ["/docker-entrypoint.sh"] ---> Running in 99c1d96acab9 Removing intermediate container 99c1d96acab9 ---> addfc0678e66 Successfully built addfc0678e66 Successfully tagged chris-asterisk:latest
-
@chrisham said in USB in Docker via neuer Container über Compose u.a. andere:
Was mich allerdings wundert: in dem docker-file von andrius steht jetzt wieder port 5060 drin:
das hatte ich dir oben schon mal versucht zu sagen. aber du warst anderweitig überzeugt.
ich weiß auch nicht welcher port da für was da ist. es kann durchaus sein, das es mehrere ports sind, die nach außen durchgereicht werden müssen.
https://forum.iobroker.net/topic/69281/usb-in-docker-via-neuer-container-über-compose-u-a-andere/85?_=1698757422545im normalen bridge modus müssen alle ports deklariert werden
im host mode sind eh alle offen. -
@oliverio jetzt habe ich beide Varianten durchgespielt:
a) überall 5060 eingetragen
b) überall 5038 eingetragenüberall heißt:
- im docker-file von andrius (wie original)
- im docker-compose-file
- in config des IOBroker Asterisk-Adapters
- im manager.conf file des asterisk containers
Ergebnis:
- bei a) Adapter kann gar nicht zu asterisk container verbinden
- bei b) Verbindung zu asterisk-container funktioniert, aber telefon-funktion geht nicht
also bei 5038 geht noch etwas mehr als bei 5060.
Da wirds jetzt natürlich knifflig, muss wohl doch mal den andrius kontaktieren...
-
@chrisham @chrisham @chrisham , @OliverIO @Marc-Berg ,:
Mal ein Zwischenstatus, dieser Thread und ihr habt mich ja schon länger be- und geleitet:1.) Docker-Setup Allgemein: ich habe nun wirklich einen reifen Stand meines wiederherstellbaren Docker-Konglomerats erreicht, d.h. ich kann grundsätzlich das Setup jederzeit reproduzierbar wiederherstellen oder updaten mittels "Stack-" Mechanismus von Portainer. Es laufen alle Applikationen wieder wie zuvor (beim "handgestrickten" Setup), bis auf eine kleine Ausnahme, siehe Punkt 2.)
2.) Der Asterisk-Adapter im IOBroker kann immer noch nicht die Telefonanrufe über die Asterisk-Lib (jetzt auch verpackt in eigenen Docker-Container, d.h. modifizierter basierend auf andrius/asterisk:latest) noch nicht absetzen, s.o. Aber ich werde dazu jetzt einen eigenen Thread aufmachen, das passt jetzt nicht wirklich mehr hier her.
3.) USB-Verbindung: das war ja der eigentliche Ausgangsunkt dieses Threads. Prinzipiell müsste die USB-Verbindung hergestellt sein, allerdings scheint das Device (Smartmeter-Connector) noch nicht richtig zu senden. Da warte ich noch auf den Freischaltcode vom lokalen Energieversorger. Bis jetzt gibt es diese Fehlermeldung:
D.h. ich werde noch No. 3.) im Rahmen dieses Threads (hoffentlich) zum Abschluss bringen und dann diesen Thread schließen.
Vielen Dank euch allen, die ihr mich hier durchgeführt habt, ich habe sehr viel gelernt und bin in meinem Smarthome-System einen großen Schritt weiter gekommen.
-
@chrisham sagte in USB in Docker via neuer Container über Compose u.a. andere:
3.) USB-Verbindung: das war ja der eigentliche Ausgangsunkt dieses Threads
weiß nicht mehr so genau ob ich oder jemand anderes dazu schon was geschrieben hat.
als erstes musst du dir sicher sein, das das usb device auf dem host erkannt wurde
dann musst du schauen unter welchem pfad das device ansprechbar ist
diesen pfad kann man durchreichen
ich sehe, du hast in der device section auch etwas benannt
dann kannst du mal im container noch die gleichen untersuchungen machen, ob das betriebssystem im container das ebenfalls erkennt
falls nicht, kannst du im docker-compose eine ebene unterhalb der service-konfiguration die folgende option setzenprivileged: true
eigentlich hat docker genau dafür die device section eingeführt, damit docker weiß, es muss hier speziell mit umgehen, aber mal schauen was das bring.
aber wie gesagt, wenn das device im container nicht sichtbar ist, dann bringt auch die Erweiterung nicht.
evtl mal noch zum besseren verständnis, weil ich auch vergessen hab was das für ein usb device ist. bei start des containers, also start des betriebssystems im container, laufen die normalen scans nach angeschlossener hardware ab. wenn dann was erkannt wird, dann wird geschaut ob ein kernel treiber dafür da ist. wenn das spezielle hardware ist, dann kann sein, das da etwas fehlt und ebenfalls im container installiert werden muss.was war das nochmal für ein device? dann kann man im internet schauen ob es sonst da probleme gibt.
-
@oliverio said in USB in Docker via neuer Container über Compose u.a. andere:
@chrisham sagte in USB in Docker via neuer Container über Compose u.a. andere:
3.) USB-Verbindung: das war ja der eigentliche Ausgangsunkt dieses Threads
weiß nicht mehr so genau ob ich oder jemand anderes dazu schon was geschrieben hat.
als erstes musst du dir sicher sein, das das usb device auf dem host erkannt wurde
Das Device auf dem Host sieht man hier:
Es ist also das Device/dev/ttyUSB0
so wie dann auch im docker compose file auch verwendet unter devices:
devices: - /dev/ttyUSB0:/dev/ttyUSB0
dann musst du schauen unter welchem pfad das device ansprechbar ist
s.o.:
/dev/ttyUSB0
diesen pfad kann man durchreichen
ich sehe, du hast in der device section auch etwas benannt
dann kannst du mal im container noch die gleichen untersuchungen machen, ob das betriebssystem im container das ebenfalls erkenntInnerhalb des Containers (IObroker container) sieht es dann so aus:
D.h. also auch dort ist es unter dem Pfad
/dev/ttyUSB0
erreichbar.
falls nicht, kannst du im docker-compose eine ebene unterhalb der service-konfiguration die folgende option setzen
privileged: true
eigentlich hat docker genau dafür die device section eingeführt, damit docker weiß, es muss hier speziell mit umgehen, aber mal schauen was das bring.
aber wie gesagt, wenn das device im container nicht sichtbar ist, dann bringt auch die Erweiterung nicht.
evtl mal noch zum besseren verständnis, weil ich auch vergessen hab was das für ein usb device ist.bei start des containers, also start des betriebssystems im container, laufen die normalen scans nach angeschlossener hardware ab. wenn dann was erkannt wird, dann wird geschaut ob ein kernel treiber dafür da ist. wenn das spezielle hardware ist, dann kann sein, das da etwas fehlt und ebenfalls im container installiert werden muss.
was war das nochmal für ein device? dann kann man im internet schauen ob es sonst da probleme gibt.
Es handelt sich um einen Lesekopf für ein Smartmeter:
https://www.amazon.de/dp/B01B8N0ASY?psc=1&smid=AWNZGX9P9F1X0&ref_=chk_typ_imgToDpDafür gibt es auch einen IOBroker-Adapter und den habe ich dann auch entsprechend konfiguriert:
Dafür gibt es auch von buanet selbst diese Anleitung:
https://smarthome.buanet.de/2020/02/usb-devices-im-iobroker-docker-container-nutzen/Entsprechend habe ich in Container-Config auch diese Umgebungsvariable eingefügt:
- USBDEVICES=/dev/ttyUSB0
-
@chrisham sagte in USB in Docker via neuer Container über Compose u.a. andere:
s.o.:
kannst du hier mal schauen, ob du damit testen kannst?
https://shop.weidmann-elektronik.de/media/files_public/9d73b590bf0752a5beff32d229d4497d/HowToRaspberryPi.pdf -
@chrisham Falls jemand hier auch folgen möchte:
https://forum.iobroker.net/topic/69975/iobroker-in-container-mit-asterisk-adapter-installation -
@oliverio Ok, danke für den Hinweis, also auf Linux-Ebene (also auf Host-Ebene im NAS) mit angeschlossenem Stromzähler kommt einfach nichts an auf der Konsole:
Um wirklich einen Defekt auszuschließen habe ich dann mal an Windows-Rechner angeschlossen und mit dem mitgelieferten Testprogramm getestet, dieser verläuft erfolgreich:
Das ist echt merkwürdig, das Gerät wird ja korrekt am USB-Port erkannt...
-
@chrisham Dieses Problem ist nun auch gelöst, d.h. der Stromzähler ist erfolgreich installiert und die Werte können ausgelesen werden. Dieser kleine Anwendungsfall hat für mich einen großen und sehr lehrreichen Umweg bedeutet:
- das Durchreichen des USB-Ports in den IOBroker-Container war nachträglich beim bestehenden Container nicht möglich.
- also musste ich neuen Container anlegen (das wollte ich eh irgendwann systematisch angehen um künftig auch Updates einfach durchführen zu können
- außerdem ist die Konfiguration der Devices über DSM-UI nicht einfach möglich, also habe ich Portainer hochgezogen.
- dann gab es Probleme mit der Netzwerk-Kommunikation zwischen den anderen (alten) Containern (influxdb, grafana,...), also habe ich noch nebenbei noch das docker-compose Verfahren bei mir eingeführt
- Wieder Netzwerkprobleme wegen KNX-Adapter -> wieder auf Host-Netzwerkmodus gewechselt
- dann viele Probleme mit dem Asterisk-Adapter/Asterisk-Manager: hier noch gelernt neue Images zu erzeugen. Dennoch konnte dieses Problem (wegen fehlender asterisk-manager library im neuesten debian linux) leider bis heute noch nicht gelöst werden, das ist aber tatsächlich der einzige noch offene Punkt
- dann gab es immer noch Probleme mit der USB-Kommunikation für den Stromzähler. Das konnte nun aber gelöst werden, es war ein einfaches Verkabelungsproblem zwischne Stromzähler-Sensor und NAS.
Ich habe jetzt also (> 3 Wochen) mein bisheriges Setup wieder herstellen können + den Stromzähler-Sensor mit Adapter, Logging in Datenbank und Grafana-Visualisierung erweitert. Also für funktional einen eigentlich kleinen Schritt, jedoch ein deutlich sauberes und systematisches Setup für mein Smarthome-System. Zusätzlich auch noch Skripte erstellt für alle Backups aller persistenter Nutzdaten (Blockly-Scripte, InfluxDB, Grafana,...).
Damit beende ich diesen Thread und bedanke mich nochmals vielmals bei allen, die hier unterstützt haben!