Docker
Dockerfile

Créer une image Docker
personnelle pour Domoticz

publier 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"
docker8
- avec git , cloner une image de Domoticz , officielle ou autre
- modifier le Dockerfile
- reconstruire l'image
- lancer la nouvelle image

 

 

Contruction de l'image

Sur Github cloner une image:
- image officielle :https://github.com/domoticz/domoticz-docker
- mon image : https://github.com/mgrafr/domoticz-dockerfile

docker1

Avec Putty , sous shell :

Pour le lien de la version officielle, commande: git clone https://github.com/domoticz/domoticz-docker.git

docker2

accédez au répertoire contenant le Dockerfile: cd NOM DU REFERENTIEL GITHUB
pour le clone téléchargé: cd domoticz-docker

docker3

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 .dockerignore
ce fichier est disponible sur mon référentiel Github : https://github.com/mgrafr/domoticz-dockerfile

node_modules
.git
.cache
npm-debug.log

docker15

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 lgtv

Sur domoticz-docker c'est python3.7 qui est installé, je vais installer python3.9

Les 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 :

docker5

Création de l'image:

Ne pas oublier le point : Dokerfile est dans le répertoire courant

docker6

Pour passer la date en argument :

docker22

docker6

Pour afficher les images: sudo docker images

 

 

Configuration de docker-compose

Pour 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 page
J'ai volontairement commenter la ligne en rouge pour une meilleur compréhension des volumes.

docker7

Si avec Filezilla (ou en shel) on ajoute dans config un répertoire ./scripts qui contient nos scripts persos:

docker12

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 ;

docker13

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

docker14

Pour utiliser bash, il faut créer un lien symbolique dans l'image ,sinon utiliser /bin/bash.
ajouter dans dockerfile:
dzdocker96

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 :

docker11

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 sur
https://releases.domoticz.com/releases/beta/domoticz_linux_x86_64.tgz

 

 

Lancement de Domoticz

par docker-compose : sudo docker-compose up -d
voir cette page

Après ouverture dans un navigateur sur le port choisi précédemment :
- faire un upload de la base de données
docker9

-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

docker10

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 Hub

S’inscrire surdocker16pour créer un repository
https://hub.docker.com/

docker17

Avec Putty, en root: IMPORTANT
Se déconnecter et Se reconnecter
docker logout
docker login

docker18

 

Coupler l'image avec le repository DockerHubdocker
tag NOM IMAGE REPOSITORY DOCKERHUB

docker19

 

Envoyer l’image sur Docker Hub
docker push mgrafr/domoticz-plus

docker20

docker21

 

 

crée le 21/02/2022
maj 02/03/2022 ajout ARG à Dockerfile (exemple)

page:85