Aller au contenu principal

Image Docker personnalisée

Exécutez les déploiements Odoo de votre serveur depuis votre propre image Docker, dérivée de l'image officielle. C'est ainsi que vous ajoutez des paquets apt, des bibliothèques système, des polices ou des paquets Python compilés : les conteneurs tournent avec un utilisateur non privilégié et pip seulement, donc tout ce qui exige root à la construction va dans l'image.

Si un simple paquet Python suffit, un requirements.txt dans votre dépôt reste l'option la plus simple : il est installé à chaque déploiement sans aucun travail d'image.


Construire l'image

Partez de l'image officielle de la version d'Odoo que vous déployez, installez ce qu'il faut en root, puis revenez à l'utilisateur odoo. Un exemple typique, qui ajoute la bibliothèque d'impression CUPS :

FROM odoo:19.0
USER root
RUN apt-get update \
&& apt-get install -y --no-install-recommends libcups2 libcups2-dev gcc python3-dev \
&& pip3 install --break-system-packages pycups \
&& apt-get purge -y gcc python3-dev libcups2-dev && apt-get autoremove -y \
&& rm -rf /var/lib/apt/lists/*
USER odoo

Conservez la structure de l'image : odoo dans le PATH, les données dans /var/lib/odoo, les addons standard sous /usr/lib/python3/dist-packages/odoo/addons et pip3 disponible. Tout le reste reste à la charge de la plateforme : le code de votre dépôt et son requirements.txt sont toujours montés et installés par-dessus.

Ajouter Odoo Enterprise à l'image

Pour livrer Odoo Enterprise dans votre image, copiez les modules Enterprise dans le dossier des addons standard, /usr/lib/python3/dist-packages/odoo/addons. C'est le seul dossier qui fonctionne : la plateforme démarre Odoo avec son propre chemin d'addons, donc un addons_path défini dans le odoo.conf de l'image est ignoré, et tout ce qui se trouve sous /mnt/extra-addons est masqué par le code de votre dépôt.

Placez le code source Enterprise de votre version d'Odoo à côté de votre Dockerfile, par exemple avec un compte GitHub lié à votre abonnement Odoo Enterprise :

git clone --depth 1 --branch 19.0 https://github.com/odoo/enterprise.git

Copiez ensuite uniquement les dossiers des modules. La racine du dépôt Enterprise contient des fichiers, dont un __init__.py, qui casseraient le dossier des addons d'Odoo et l'empêcheraient de démarrer :

FROM odoo:19.0 AS enterprise
USER root
COPY enterprise/ /src/enterprise/
RUN rm -rf /src/enterprise/.git \
&& find /src/enterprise -mindepth 1 -maxdepth 1 ! -type d -delete

FROM odoo:19.0
COPY --from=enterprise --chown=odoo:odoo /src/enterprise/ /usr/lib/python3/dist-packages/odoo/addons/

Vérifiez le résultat avant de rattacher l'image ; la commande doit afficher le dossier :

docker run --rm --entrypoint ls masociete/odoo:19.0 -d /usr/lib/python3/dist-packages/odoo/addons/web_enterprise

Ne mettez jamais votre jeton GitHub dans le Dockerfile ni dans l'image.

Construisez un tag par version d'Odoo déployée, toujours <dépôt>:<version> :

docker build -t masociete/odoo:19.0 .

Vous pouvez construire directement sur le serveur, ou pousser l'image vers un registre que le serveur peut tirer anonymement.


La rattacher à votre serveur

  1. Ouvrez la page de votre serveur dans le tableau de bord et trouvez Image Docker personnalisée.
  2. Saisissez le dépôt sans tag, par exemple masociete/odoo ou registry.masociete.com/odoo.
  3. Si votre image contient Odoo Enterprise (ajouté comme décrit plus haut), activez L'image contient déjà Odoo Enterprise.
  4. Enregistrez.

Rien ne redémarre à l'enregistrement. L'image est utilisée au prochain déploiement, mise à jour ou redémarrage de chaque branche de ce serveur, et le journal de build montre l'image tirée. Une reconstruction sous le même tag est prise en compte de la même façon.

Si le pull échoue, l'image locale de ce nom est utilisée si elle existe sur le serveur ; sinon le déploiement échoue avec un message vous invitant à construire ou pousser <dépôt>:<version>. Cela nécessite l'agent 1.4.0 ou plus récent sur le serveur.


Odoo Enterprise

Trois cas :

Votre serveur a votre jeton GitHubL'image contient EnterpriseRésultat
ouipeu importeVotre image, avec en plus le code Enterprise téléchargé avec votre jeton ; les modules Enterprise déjà présents dans l'image sont prioritaires
nonouiVotre image telle quelle ; rien n'est téléchargé
nonnonVotre image est ignorée pour les projets Enterprise, qui reviennent à l'image de la plateforme

Voir Odoo Enterprise sur votre propre serveur pour le jeton.


Bon à savoir

  • Une image cassée échoue au contrôle de santé post-déploiement et le déploiement est annulé comme toute mise à jour ratée ; la raison figure dans le journal de build.
  • Seules les branches de ce serveur utilisent l'image. L'hébergement cloud géré utilise toujours l'image de la plateforme.
  • Reconstruire sous le même tag redirige le tag ; l'image précédente devient inutilisée et est nettoyée automatiquement une fois les branches passées sur la nouvelle.
  • Registres privés : le démon Docker du serveur peut conserver sa propre connexion au registre ; Skysize n'a jamais besoin des identifiants.