Docker Dockerfile Créer une image Docker personnelle pour Domoticzpublier l'image sur Docker Hub
Suite de la page consacrée à l'installation ou le transfert de Domoticz dans un Conteneur Docker Comme je l'ai indiqué dans l'article précédent ,l'installation de Domoticz dans un conteneur impose parfois de créer une nouvelle image qui prend en compte des logiciels ou des modules nécessaires pour les scripts personnels . La reconstruction d'une image à partir de l'image officielle de Domoticz est rapide lorsqu'il s'agit d'ajouter quelques modules Python,c'est l'objet de ce Tuto: Les différentes étapes , en shell ou avec Filezilla : - avec Filezilla ,sauvegarder la base de données et les dossiers scripts , plugins , ....ou tout simplement le dossier "domoticz" - avec git , cloner une image de Domoticz , officielle ou autre - modifier le Dockerfile- reconstruire l'image- lancer la nouvelle image
Contruction de l'imageSur Github cloner une image:- image officielle :https://github.com/domoticz/domoticz-docker- mon image : https://github.com/mgrafr/domoticz-dockerfile
Avec Putty , sous shell :
Pour le lien de la version officielle, commande: git clone https://github.com/domoticz/domoticz-docker.git
accédez au répertoire contenant le Dockerfile: cd NOM DU REFERENTIEL GITHUB pour le clone téléchargé: cd domoticz-docker
Créons un fichier .dockerignore dans ce répertoire pour empêcher qu'une copie de node_modules, des journaux utilisés par notre installation de Node.js, des fichiers inutiles ,... ne soient copiés sur l'image Docker.sudo nano .dockerignorece fichier est disponible sur mon référentiel Github : https://github.com/mgrafr/domoticz-dockerfile
node_modules .git .cache npm-debug.log
Avec nano on édite le fichier Dokerfile : sudo nano Dockerfile
FROM debian:buster-slim ARG APP_VERSION ARG APP_HASH ARG BUILD_DATE # If stable argument is passed it will download stable instead of beta ARG STABLE LABEL org.label-schema.version=$APP_VERSION \ org.label-schema.build-date=$BUILD_DATE \ org.label-schema.vcs-ref=$APP_HASH \ org.label-schema.vcs-url="https://github.com/domoticz/domoticz" \ org.label-schema.url="https://domoticz.com/" \ org.label-schema.vendor="Domoticz" \ org.label-schema.name="Domoticz" \ org.label-schema.description="Domoticz open source Home Automation system" \ org.label-schema.license="GPLv3" \ org.label-schema.docker.cmd="docker run -v ./config:/config -v ./plugins:/opt/domoticz/plugins -e DATABASE_PATH=/config/domoticz.db -p 8080:8080 -d domoticz/domoticz" \ maintainer="Domoticz Docker Maintainers <info@domoticz.com>" WORKDIR /opt/domoticz ARG DEBIAN_FRONTEND=noninteractive RUN set -ex \ && apt-get update \ && apt-get install --no-install-recommends -y \ tzdata \ unzip \ git \ libudev-dev \ libusb-0.1-4 \ libsqlite3-0 \ curl libcurl4 libcurl4-gnutls-dev \ libpython3.7-dev \ python3 \ python3-pip \ && OS="$(uname -s | sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/')" \ && MACH=$(uname -m) \ && if [ ${MACH} = "armv6l" ]; then MACH = "armv7l"; fi \ && archive_file="domoticz_${OS}_${MACH}.tgz" \ && version_file="version_${OS}_${MACH}.h" \ && history_file="history_${OS}_${MACH}.txt" \ && if [ -z "$STABLE"]; then curl -k -L https://releases.domoticz.com/releases/beta/${archive_file} --output domoticz.tgz; else curl -k -L https://releases.domoticz.com/releases/release/${archive_file} --output domoticz.tgz; fi \ && tar xfz domoticz.tgz \ && rm domoticz.tgz \ && mkdir -p /opt/domoticz/userdata \ && rm -rf /var/lib/apt/lists/* \ && ln -s /usr/bin/pip3 /usr/bin/pip \ && pip3 install setuptools requests VOLUME /opt/domoticz/userdata EXPOSE 8080 EXPOSE 6144 EXPOSE 443 ENV LOG_PATH= ENV DATABASE_PATH= ENV WWW_PORT=8080 ENV SSL_PORT=443 ENV EXTRA_CMD_ARG= # timezone env with default ENV TZ=Europe/Amsterdam COPY docker-entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/docker-entrypoint.sh \ && ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat ENTRYPOINT ["docker-entrypoint.sh"] CMD ["/opt/domoticz/domoticz"]
Si vous avez lu mon article précédent concernant Domoticz sur Docker, mon image Domotiz doit intégrer :- les modules python , Fabric et Python-periphery - Node.js et le module lgtvSur domoticz-docker c'est python3.7 qui est installé, je vais installer python3.9Les modifications à apporter , en rouge, les arguments (exemple) en bleu :
FROM debian:bullseye-slim ARG APP_VERSION ARG APP_HASH ARG BUILD_DATE # If stable argument is passed it will download stable instead of beta ARG STABLE LABEL org.label-schema.version=$APP_VERSION \ org.label-schema.build-date=$BUILD_DATE \ org.label-schema.vcs-ref=$APP_HASH \ org.label-schema.vcs-url="https://github.com/mgrafr/domoticz-docker" \ org.label-schema.url="https://domoticz.com/" \ org.label-schema.vendor="Domo" \ org.label-schema.name="domoticz" \ org.label-schema.description="Domoticz open source Home Automation system" \ org.label-schema.license="GPLv3" \ org.label-schema.docker.cmd="docker run -v ./config:/config -v ./plugins:/opt/domoticz/plugins -e DATABASE_PATH=/config/domoticz.db -p 8086:8080 -d domoticz/domoticz" \ maintainer="Domoticz Docker Maintainers " WORKDIR /opt/domoticz ARG DEBIAN_FRONTEND=noninteractive RUN set -ex \ && apt-get update \ && apt-get install --no-install-recommends -y \ tzdata \ unzip \ git \ libudev-dev \ libusb-0.1-4 \ libsqlite3-0 \ curl libcurl4-gnutls-dev \ python3.9 \ libpython3.9-dev \ python3 \ python3-pip \ && OS="$(uname -s | sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/')" \ && MACH=$(uname -m) \ && if [ ${MACH} = "armv6l" ]; then MACH = "armv7l"; fi \ && archive_file="domoticz_${OS}_${MACH}.tgz" \ && version_file="version_${OS}_${MACH}.h" \ && history_file="history_${OS}_${MACH}.txt" \ && if [ -z "$STABLE"]; then curl -k -L https://releases.domoticz.com/releases/beta/${archive_file} --output domoticz.tgz; else curl -k -L https://releases.domoticz.com/releases/release/${archive_file} --output domoticz.tgz; fi \ && tar xfz domoticz.tgz \ && rm domoticz.tgz \ && mkdir -p /home/domoticz/userdata \ && rm -rf /var/lib/apt/lists/* \ && pip3 install requests \ && pip3 install fabric2 \ && pip3 install python-periphery \ && curl -fsSL https://deb.nodesource.com/setup_17.x | bash - \ && apt-get install nodejs -yq \ && apt-get clean -y \ && npm install lgtv \ && npm install superagent VOLUME /opt/domoticz/userdata EXPOSE 8080 EXPOSE 6144 EXPOSE 443 ENV LOG_PATH= ENV DATABASE_PATH= ENV WWW_PORT=8080 ENV SSL_PORT=443 ENV EXTRA_CMD_ARG= # timezone env with default ENV TZ=Europe/Paris COPY docker-entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/docker-entrypoint.sh \ && ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat ENTRYPOINT ["docker-entrypoint.sh"] CMD ["/opt/domoticz/domoticz"]
Des explications :
Création de l'image:
Ne pas oublier le point : Dokerfile est dans le répertoire courant
Pour passer la date en argument :
Pour afficher les images: sudo docker images
Configuration de docker-composePour le Dockerfile développé plus haut ,le fichier docker-compose.yml,inclus dans mon référentiel Github: https://github.com/mgrafr/domoticz-dockerfile
version: '3.3' services: domoticz: image: domotic/dz container_name: domotic restart: unless-stopped # Pass devices to container devices: # cle zwave - "/dev/serial/by-id/usb-0658_0200-if00:/dev/ttyACM0" ports: - "8086:8080" volumes: - ./config:/opt/domoticz/userdata #- ./scripts:/opt/domoticz/scripts - ./bash:/user/bin/bash - ./www/modules_lua:/home/domoticz/www/modules_lua - ./log:/home/michel environment: - TZ=Europe/Paris - LOG_PATH=/home/domoticz/userdata/domoticz.log - WEBROOT=domoticz
pour plus d'explications voir cette pageJ'ai volontairement commenter la ligne en rouge pour une meilleur compréhension des volumes.
Si avec Filezilla (ou en shel) on ajoute dans config un répertoire ./scripts qui contient nos scripts persos:
Pourquoi le répertoire dzVents est obligatoire ? - pour éviter une erreur Domoticz , les scripts dzVent lorsqu'ils sont crées ou modifiés sont enregistrés dans :/opt/domoticz/userdata/scripts/dzVents/generated_scripts ;
les scripts étant dans "config" , pour les éxécuter depuis Domoticz et LUA, il faudra appeler les fichiers bash python ou autres, dans le répertoire /opt/domoticz/userdata/scripts/python (ou bash,..);il a été déclaré dans docker-compose.yml config: /opt:domoticz:/userdata et dans Dockerfile : VOLUME /opt/domoticz/userdata
Pour utiliser bash, il faut créer un lien symbolique dans l'image ,sinon utiliser /bin/bash.ajouter dans dockerfile: Si la ligne "#- ./scripts:/opt/domoticz/scripts", dans docker-compose.yml est décommentée il sera crée un volume pour les scripts persos /opt/domoticz/scripts , l'arborescence des répertoires sur Filezilla :
Dans LUA, il faudra alors appelé les scripts persos dans /opt/domoticz/scripts/.. Cette solution peut , être intéressante, car les liens relatifs restent les mêmes que dans la version classique ; le dossier "scripts" de Domoticz comprends surtout des exemples mais on peut avoir besoin, par exemple du fichier JSON.lua , dans ce cas il faudra créer un s/dossier lua et y ajouter ce fichier; pour les exemples , il suffit de télécharger et d'extraire Domoticz surhttps://releases.domoticz.com/releases/beta/domoticz_linux_x86_64.tgz
Lancement de Domoticzpar docker-compose : sudo docker-compose up -dvoir cette pageAprès ouverture dans un navigateur sur le port choisi précédemment :- faire un upload de la base de données -arrêter Domoticz , en shell : docker-compose down - avec Filezilla remplacer le dossier script , par celui sauvegardé - copier le contenu du dossier plugins sauvegardé dans /plugins - si d'autres dossiers sont utilisés(pour moi , www/modules_lua), les installer - relancer Domoticz :sudo docker-compose up -d - modifier les liens des scripts s'il y a lieu , voir cette page Verifier l'installation des modules dans le conteneur: pour connaître l'ID du conteneur : docker ps
Remarque: en choisissant un WORKDIR identique au répertoire de Domoticz linux , les modifications de liens peuvent être limitées , (/home/USER/domoticz)
Publier l'image sur Docker HubS’inscrire surpour créer un repositoryhttps://hub.docker.com/
Avec Putty, en root: IMPORTANT Se déconnecter et Se reconnecterdocker logoutdocker login
Coupler l'image avec le repository DockerHubdocker tag NOM IMAGE REPOSITORY DOCKERHUB
Envoyer l’image sur Docker Hubdocker push mgrafr/domoticz-plus
crée le 21/02/2022maj 02/03/2022 ajout ARG à Dockerfile (exemple)