From fbdb0bfe3379bb2fe0d9f43c8eb2e1ca3641a782 Mon Sep 17 00:00:00 2001 From: syoul Date: Thu, 25 Dec 2025 16:38:42 +0100 Subject: [PATCH] =?UTF-8?q?Am=C3=A9liorations=20Docker:=20d=C3=A9pendances?= =?UTF-8?q?=20LaTeX=20et=20gestion=20fichiers=20multiples?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ajout texlive-xetex et fonts-dejavu pour support Unicode/emoji - Ajout texlive-latex-recommended pour packages LaTeX complets - Amélioration docker_run.sh pour gérer plusieurs fichiers MD - Correction gestion TTY pour exécution non-interactive --- .dockerignore | 2 + Dockerfile | 9 ++- docker_run.sh | 218 +++++++++++++++++++++++++++++++++++--------------- 3 files changed, 161 insertions(+), 68 deletions(-) diff --git a/.dockerignore b/.dockerignore index 034e9d4..0e6aa1b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -47,3 +47,5 @@ docker_run.sh # Fichiers de test documents/test.md +# Documents sources (pour éviter de les copier dans l'image) +documents/*.md diff --git a/Dockerfile b/Dockerfile index a3becf2..43dd467 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,6 +12,7 @@ ENV DEBIAN_FRONTEND=noninteractive \ LC_ALL=fr_FR.UTF-8 # Installation des dépendances système et locales +# Optimisation: combiner toutes les installations en une seule couche RUN apt-get update && \ apt-get install -y --no-install-recommends \ locales \ @@ -22,17 +23,20 @@ RUN apt-get update && \ texlive-latex-base \ texlive-xetex \ texlive-fonts-recommended \ + texlive-latex-recommended \ texlive-latex-extra \ + texlive-fonts-extra \ texlive-lang-french \ fonts-dejavu \ + lmodern \ cups \ cups-client \ evince \ curl \ ca-certificates \ make \ - && rm -rf /var/lib/apt/lists/* \ - && apt-get clean + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # Création d'un utilisateur non-root pour sécurité RUN useradd -m -u 1000 -s /bin/bash mdprint && \ @@ -55,4 +59,3 @@ USER mdprint # Point d'entrée ENTRYPOINT ["/usr/local/bin/md_to_print.sh"] CMD ["--help"] - diff --git a/docker_run.sh b/docker_run.sh index be1fbe5..0b142ac 100755 --- a/docker_run.sh +++ b/docker_run.sh @@ -2,11 +2,11 @@ # Wrapper pour exécuter le script MD_to_Print dans Docker # Usage: ./docker_run.sh fichier.md [options...] +# ./docker_run.sh fichier1.md fichier2.md [options...] set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -MD_FILE="${1:-}" # Couleurs RED='\033[0;31m' @@ -21,17 +21,20 @@ show_help() { Wrapper Docker pour MD_to_Print Usage: $0 fichier.md [options...] + $0 fichier1.md fichier2.md [options...] Ce script simplifie l'exécution de MD_to_Print dans Docker en gérant: - Les chemins absolus des fichiers - Le montage des volumes - Le passage des arguments - La gestion des erreurs Docker +- Le traitement de plusieurs fichiers en boucle EXEMPLES: $0 documents/rapport.md --preview $0 documents/rapport.md --printer HP_LaserJet --copies 2 - $0 documents/rapport.md --config config.conf --verbose + $0 documents/*.md --keep-pdf --verbose + $0 documents/fichier1.md documents/fichier2.md --keep-pdf OPTIONS: Toutes les options de md_to_print.sh sont supportées. @@ -40,10 +43,40 @@ OPTIONS: EOF } +# Collecter les fichiers markdown et les options +MD_FILES=() +OPTIONS=() +PROCESSING_FILES=true + +for arg in "$@"; do + if [ "$PROCESSING_FILES" = true ]; then + # Vérifier si c'est une option (commence par -) + if [[ "$arg" =~ ^- ]]; then + PROCESSING_FILES=false + OPTIONS+=("$arg") + # Vérifier si c'est un fichier markdown + elif [[ "$arg" =~ \.(md|markdown)$ ]] || [ -f "$arg" ]; then + MD_FILES+=("$arg") + else + # Argument ambigu, arrêter la collecte de fichiers + PROCESSING_FILES=false + OPTIONS+=("$arg") + fi + else + OPTIONS+=("$arg") + fi +done + # Vérification des arguments -if [ -z "$MD_FILE" ] || [ "$MD_FILE" = "-h" ] || [ "$MD_FILE" = "--help" ]; then - show_help - exit 0 +if [ ${#MD_FILES[@]} -eq 0 ]; then + if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ] || [ -z "${1:-}" ]; then + show_help + exit 0 + else + echo -e "${RED}Erreur: Aucun fichier markdown spécifié${NC}" + show_help + exit 1 + fi fi # Vérifier que Docker est disponible @@ -52,25 +85,13 @@ if ! command -v docker &> /dev/null; then exit 1 fi -# Vérifier que le fichier existe -if [ ! -f "$MD_FILE" ]; then - echo -e "${RED}Erreur: Le fichier '$MD_FILE' n'existe pas${NC}" - exit 2 -fi - -# Obtenir le chemin absolu du fichier -MD_FILE_ABS="$(realpath "$MD_FILE")" -MD_DIR="$(dirname "$MD_FILE_ABS")" -MD_NAME="$(basename "$MD_FILE_ABS")" - -# Vérifier que le fichier est dans le répertoire documents ou un sous-répertoire -if [[ ! "$MD_DIR" =~ ^"$SCRIPT_DIR"/documents ]]; then - echo -e "${YELLOW}Attention: Le fichier n'est pas dans le répertoire documents/${NC}" - echo -e "${BLUE}Le fichier sera accessible via le montage du répertoire parent${NC}" - MD_REL_PATH="$(realpath --relative-to="$SCRIPT_DIR" "$MD_FILE_ABS")" - MD_DIR="$SCRIPT_DIR" - MD_NAME="$MD_REL_PATH" -fi +# Vérifier que tous les fichiers existent +for MD_FILE in "${MD_FILES[@]}"; do + if [ ! -f "$MD_FILE" ]; then + echo -e "${RED}Erreur: Le fichier '$MD_FILE' n'existe pas${NC}" + exit 2 + fi +done # Créer les répertoires nécessaires mkdir -p "$SCRIPT_DIR/documents" "$SCRIPT_DIR/output" "$SCRIPT_DIR/logs" @@ -82,49 +103,116 @@ if ! docker images md-to-print:latest --format "{{.Repository}}:{{.Tag}}" | grep docker build -t md-to-print:latest . fi -# Construire la commande Docker -DOCKER_CMD=( - docker run - --rm - -it - -v "$SCRIPT_DIR/documents:/workspace/documents:ro" - -v "$SCRIPT_DIR/output:/workspace/output" - -v "$SCRIPT_DIR/logs:/workspace/logs" - --network host -) - -# Ajouter le support X11 si DISPLAY est défini (pour prévisualisation) -if [ -n "${DISPLAY:-}" ]; then - DOCKER_CMD+=( - -e DISPLAY="$DISPLAY" - -v /tmp/.X11-unix:/tmp/.X11-unix:ro +# Fonction pour traiter un fichier +process_file() { + local MD_FILE="$1" + shift + local FILE_OPTIONS=("$@") + + echo -e "${GREEN}=== Traitement de: $MD_FILE ===${NC}" + + # Obtenir le chemin absolu du fichier + MD_FILE_ABS="$(realpath "$MD_FILE")" + MD_DIR="$(dirname "$MD_FILE_ABS")" + MD_NAME="$(basename "$MD_FILE_ABS")" + + # Vérifier que le fichier est dans le répertoire documents ou un sous-répertoire + if [[ ! "$MD_DIR" =~ ^"$SCRIPT_DIR"/documents ]]; then + echo -e "${YELLOW}Attention: Le fichier n'est pas dans le répertoire documents/${NC}" + echo -e "${BLUE}Le fichier sera accessible via le montage du répertoire parent${NC}" + MD_REL_PATH="$(realpath --relative-to="$SCRIPT_DIR" "$MD_FILE_ABS")" + MD_DIR="$SCRIPT_DIR" + MD_NAME="$MD_REL_PATH" + fi + + # Déterminer si on a besoin d'un TTY interactif (prévisualisation ou un seul fichier) + NEED_TTY=false + for opt in "${FILE_OPTIONS[@]}"; do + if [ "$opt" = "--preview" ] || [ "$opt" = "-p" ]; then + NEED_TTY=true + break + fi + done + + # Si un seul fichier et TTY disponible, utiliser mode interactif + if [ ${#MD_FILES[@]} -eq 1 ] && [ -t 0 ] && [ "$NEED_TTY" = true ]; then + DOCKER_TTY_FLAGS="-it" + elif [ -t 0 ]; then + DOCKER_TTY_FLAGS="-i" + else + DOCKER_TTY_FLAGS="" + fi + + # Construire la commande Docker + DOCKER_CMD=( + docker run + --rm ) -fi + + # Ajouter les flags TTY si nécessaire + if [ -n "$DOCKER_TTY_FLAGS" ]; then + DOCKER_CMD+=($DOCKER_TTY_FLAGS) + fi + + DOCKER_CMD+=( + -v "$SCRIPT_DIR/documents:/workspace/documents:ro" + -v "$SCRIPT_DIR/output:/workspace/output" + -v "$SCRIPT_DIR/logs:/workspace/logs" + --network host + ) + + # Ajouter le support X11 si DISPLAY est défini (pour prévisualisation) + if [ -n "${DISPLAY:-}" ]; then + DOCKER_CMD+=( + -e DISPLAY="$DISPLAY" + -v /tmp/.X11-unix:/tmp/.X11-unix:ro + ) + fi + + # Ajouter l'accès CUPS si disponible + if [ -d "/var/run/cups" ]; then + DOCKER_CMD+=(-v /var/run/cups:/var/run/cups:ro) + fi + + DOCKER_CMD+=(md-to-print:latest) + + # Ajouter le fichier markdown + if [[ "$MD_DIR" == "$SCRIPT_DIR" ]]; then + DOCKER_CMD+=("/workspace/$MD_NAME") + else + DOCKER_CMD+=("/workspace/documents/$MD_NAME") + fi + + # Ajouter les options + for opt in "${FILE_OPTIONS[@]}"; do + DOCKER_CMD+=("$opt") + done + + # Exécuter + echo -e "${BLUE}Commande: ${DOCKER_CMD[*]}${NC}" + echo "" + + if ! "${DOCKER_CMD[@]}"; then + echo -e "${RED}Erreur lors du traitement de $MD_FILE${NC}" + return 1 + fi + + return 0 +} -# Ajouter l'accès CUPS si disponible -if [ -d "/var/run/cups" ]; then - DOCKER_CMD+=(-v /var/run/cups:/var/run/cups:ro) -fi - -DOCKER_CMD+=(md-to-print:latest) - -# Ajouter le fichier markdown et les options -if [[ "$MD_DIR" == "$SCRIPT_DIR" ]]; then - DOCKER_CMD+=("/workspace/$MD_NAME") -else - DOCKER_CMD+=("/workspace/documents/$MD_NAME") -fi - -# Ajouter les options restantes -shift -for arg in "$@"; do - DOCKER_CMD+=("$arg") +# Traiter tous les fichiers +EXIT_CODE=0 +for MD_FILE in "${MD_FILES[@]}"; do + if ! process_file "$MD_FILE" "${OPTIONS[@]}"; then + EXIT_CODE=1 + fi + echo "" done -# Exécuter -echo -e "${GREEN}Exécution dans Docker...${NC}" -echo -e "${BLUE}Commande: ${DOCKER_CMD[*]}${NC}" -echo "" - -exec "${DOCKER_CMD[@]}" +if [ $EXIT_CODE -eq 0 ]; then + echo -e "${GREEN}=== Tous les fichiers ont été traités avec succès ===${NC}" +else + echo -e "${YELLOW}=== Certains fichiers ont échoué ===${NC}" +fi +exit $EXIT_CODE