Installation docker : dossier `sites` hors-conteneur

Salut,
Je cherche à installer un Dokos pour le réseau de tiers-lieux de La Réunion.
Je dois modifier le compose original car sur notre serveur on n’utilise pas les volumes virtuels gérés par Docker mais ceux qui sont montés dans le dossier local (c’est à dire concrètement en mettant un chemin local avec ./ devant le nom du volume)
Et çà a l’air de poser souci avec les services de ce compose. J’ai l’impression que ca vient du fait qu’un même volume est utilisé par plusieurs services. Par exemple en première erreur le service create-site ne trouve pas le fichier sites/common_site_config.json
Je n’ai pas encore réussi à le faire tourner malgré plein de tentatives, est ce que quelqu’un a déjà fait çà pour avoir un compose fonctionnel avec des bind locaux ?

J’ai pas testé avec dokos, je suis tout juste en train de démarrer des tests d’installation avec docker.

Lorsque j’ai besoin de faire un bind local, à partager entre plusieurs services ou non, je fais un truc du genre :

volumes:
  un-nom-de-volume:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/chemin/vers/mon/répertoire/local'

Bonjour @Guillaume,

Le fichier <docker>/sites/common_site_config.json est présent dans l’image normalement [1].

C’est bizarre que le common_site_config.json ne soit pas copié dans ton dossier local. Peut-être qu’il faut supprimer le dossier (vide) des sites s’il existe localement, avant de lancer les conteneurs pour la première fois ?

Je veux dire : s’il y a un dossier local pour les sites qui existe déjà, alors Docker ne va pas l’écraser avec le contenu de l’image, et donc tu auras un dossier/volume sites vide du point de vue des conteneurs je crois. [2]

Corentin

1. Containerfile issu de frappe_docker

2. Le dossier local écrase le contenu issu de l’image

Merci pour toutes ces réponses,
les dossiers locaux étaient écrasés probablement parce que je montais comme ca:

  volumes:
    - **./data/sites**:/home/frappe/frappe-bench/sites

J’avais bien essayé comme vous suggérez d’utiliser les volumes en précisant le chemin du device, et vous avez confirmé que c’était la piste alors j’ai re-essayé et je me suis rendu compte que je n’avais pas fait de compose down -v pour recréer le volume. Donc c’est ok j’ai réussi à faire comme je le souhaite, avec mes dossiers de données dans mon dossier local, et avec Traefik en proxy

Merci !

2 Likes

Bonjour, pourrais-tu partager ta config et entre autre le docker-compose ?
Merci d’avance.

Bien sur voici :

version: "3"

name: dodock

x-image: &image
  image: registry.gitlab.com/dokos/dokos

x-depends-on-ready: &depends_on_site_ready
  depends_on:
    configurator:
      condition: service_completed_successfully
    create-site:
      condition: service_completed_successfully

x-restart-on-failure: &restart_on_failure
  deploy:
    restart_policy:
      condition: on-failure

x-backend-defaults: &backend_defaults
  <<: [*depends_on_site_ready, *restart_on_failure, *image]
  volumes:
    - sites:/home/frappe/frappe-bench/sites
    - logs:/home/frappe/frappe-bench/logs

services:
  backend:
    hostname: backend
    <<: *backend_defaults
    extra_hosts:
      localhost: 172.17.0.1
      dokos.XXX.re: 172.17.0.1
    networks:
      - dokos   
      - frontend
      
  configurator:
    <<: *backend_defaults
    depends_on: {}
    deploy:
      restart_policy:
        condition: "no"
    entrypoint: bash -cx
    command:
      - >
        ls -1 apps > sites/apps.txt;
        bench set-config -g db_host $$DB_HOST;
        bench set-config -gp db_port $$DB_PORT;
        bench set-config -g redis_cache "redis://$$REDIS_CACHE";
        bench set-config -g redis_queue "redis://$$REDIS_QUEUE";
        bench set-config -g redis_socketio "redis://$$REDIS_SOCKETIO";
        bench set-config -gp socketio_port $$SOCKETIO_PORT;
    environment:
      DB_HOST: db
      DB_PORT: "3306"
      REDIS_CACHE: redis-cache:6379
      REDIS_QUEUE: redis-queue:6379
      REDIS_SOCKETIO: redis-socketio:6379
      SOCKETIO_PORT: "9000"

  create-site:
    <<: *image
    depends_on:
      configurator:
        condition: service_completed_successfully
      db:
        condition: service_started
      redis-cache:
        condition: service_started
      redis-queue:
        condition: service_started
      redis-socketio:
        condition: service_started
    deploy:
      restart_policy:
        condition: "no"
    volumes:
      - sites:/home/frappe/frappe-bench/sites
      - logs:/home/frappe/frappe-bench/logs
    entrypoint: bash -c
    command:
      - >
        wait-for-it -t 120 db:3306;
        wait-for-it -t 120 redis-cache:6379;
        wait-for-it -t 120 redis-queue:6379;
        wait-for-it -t 120 redis-socketio:6379;
        export start=`date +%s`;
        until [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".db_host // empty"` ]] && \
          [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".redis_cache // empty"` ]] && \
          [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".redis_queue // empty"` ]];
        do
          echo "Waiting for sites/common_site_config.json to be created";
          sleep 5;
          if (( `date +%s`-start > 120 )); then
            echo "could not find sites/common_site_config.json with required keys";
            exit 1
          fi
        done;
        echo "sites/common_site_config.json found";
        bench new-site frontend --no-mariadb-socket --admin-password=admin --db-root-password=admin --install-app dokos --install-app hrms --set-default || exit 0;
        echo; echo "Site creation completed successfully"; echo;
    networks:
      - dokos 
      - frontend

  db:
    <<: *restart_on_failure
    hostname: db
    image: mariadb:10.6
    healthcheck:
      test: mysqladmin ping -h localhost --password=admin
      interval: 1s
      retries: 15
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
      - --skip-character-set-client-handshake
      - --skip-innodb-read-only-compressed # Temporary fix for MariaDB 10.6
    environment:
      MYSQL_ROOT_PASSWORD: admin
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - dokos   

  frontend:
    <<: *backend_defaults
    command: nginx-entrypoint.sh
    environment:
      BACKEND: backend:8000
      FRAPPE_SITE_NAME_HEADER: frontend
      SOCKETIO: websocket:9000
      UPSTREAM_REAL_IP_ADDRESS: 127.0.0.1
      UPSTREAM_REAL_IP_HEADER: X-Forwarded-For
      UPSTREAM_REAL_IP_RECURSIVE: "off"
      PROXY_READ_TIMOUT: 120
      CLIENT_MAX_BODY_SIZE: 50m
    #ports:
    #  - "8080:8080"
    labels:
      - traefik.enable=true
      - traefik.docker.network=frontend
      # ROUTER https
      - traefik.http.routers.dokos-RTLx.tls.certresolver=myresolver
      - traefik.http.routers.dokos-RTLx.rule=Host(`dokos.XXX.re`)
      - traefik.http.routers.dokos-RTLx.entrypoints=entrypoints-https      
      - traefik.http.services.dokos-RTLx.loadbalancer.server.port=8080

    networks:
      - dokos
      - frontend
      
  queue-default:
    <<: *backend_defaults
    command: bench worker --queue default
    networks:
      - dokos 

  queue-long:
    <<: *backend_defaults
    command: bench worker --queue long
    networks:
      - dokos 

  queue-short:
    <<: *backend_defaults
    command: bench worker --queue short
    networks:
      - dokos 

  redis-queue:
    <<: *restart_on_failure
    image: redis:6.2-alpine
    volumes:
      - redis-queue-data:/data
    networks:
      - dokos 

  redis-cache:
    <<: *restart_on_failure
    image: redis:6.2-alpine
    volumes:
      - redis-cache-data:/data
    networks:
      - dokos 

  redis-socketio:
    <<: *restart_on_failure
    image: redis:6.2-alpine
    volumes:
      - redis-socketio-data:/data
    networks:
      - dokos 

  scheduler:
    <<: *backend_defaults
    command: bench schedule
    networks:
      - dokos 

  websocket:
    hostname: websocket
    <<: *backend_defaults
    command: node /home/frappe/frappe-bench/apps/frappe/socketio.js
    networks:
      - dokos 

volumes:
  db-data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: ./data/db
  redis-queue-data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: ./data/redis-queue
  redis-cache-data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: ./data/redis-cache  
  redis-socketio-data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: ./data/redis-socketio
  sites:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: ./data/sites
  logs:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: ./data/logs

networks:
  dokos:
    internal: true
  frontend:
    external: true
1 Like

@oryxr @Guillaume

À titre informatif, le create-site sert uniquement pour créer le site initial (qui s’appelle frontend).

Et l’application webshop (E-commerce) n’est pas installée par défaut sur ce site (c’est un bug que je suis en train de corriger).

La même ligne sur le répertoire GitLab :

Merci, ca marche bien (je n’ai pas réussi à fonctionner avec le dossier sites hors-conteneur. J’ai du enlever toutes les configs des volumes).

Sinon, je voulais savoir comment ajouter un 2ème site avec avec traefik.
Faut-il créer un second container frontend (frontend2 !!) ?

Merci d’avance.