Améliorations Docker: dépendances LaTeX et gestion fichiers multiples

- 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
This commit is contained in:
syoul
2025-12-25 16:38:42 +01:00
parent 8ff8658ba7
commit fbdb0bfe33
3 changed files with 161 additions and 68 deletions

View File

@@ -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

View File

@@ -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"]

View File

@@ -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
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,11 +85,31 @@ if ! command -v docker &> /dev/null; then
exit 1
fi
# Vérifier que le fichier existe
# 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"
# Vérifier si l'image Docker existe
if ! docker images md-to-print:latest --format "{{.Repository}}:{{.Tag}}" | grep -q "md-to-print:latest"; then
echo -e "${YELLOW}Image Docker non trouvée. Construction de l'image...${NC}"
cd "$SCRIPT_DIR"
docker build -t md-to-print:latest .
fi
# 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")"
@@ -72,21 +125,36 @@ if [[ ! "$MD_DIR" =~ ^"$SCRIPT_DIR"/documents ]]; then
MD_NAME="$MD_REL_PATH"
fi
# Créer les répertoires nécessaires
mkdir -p "$SCRIPT_DIR/documents" "$SCRIPT_DIR/output" "$SCRIPT_DIR/logs"
# 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
# Vérifier si l'image Docker existe
if ! docker images md-to-print:latest --format "{{.Repository}}:{{.Tag}}" | grep -q "md-to-print:latest"; then
echo -e "${YELLOW}Image Docker non trouvée. Construction de l'image...${NC}"
cd "$SCRIPT_DIR"
docker build -t md-to-print:latest .
# 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
-it
)
# 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"
@@ -108,23 +176,43 @@ fi
DOCKER_CMD+=(md-to-print:latest)
# Ajouter le fichier markdown et les options
# 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 restantes
shift
for arg in "$@"; do
DOCKER_CMD+=("$arg")
# Ajouter les options
for opt in "${FILE_OPTIONS[@]}"; do
DOCKER_CMD+=("$opt")
done
# Exécuter
echo -e "${GREEN}Exécution dans Docker...${NC}"
echo -e "${BLUE}Commande: ${DOCKER_CMD[*]}${NC}"
echo ""
exec "${DOCKER_CMD[@]}"
if ! "${DOCKER_CMD[@]}"; then
echo -e "${RED}Erreur lors du traitement de $MD_FILE${NC}"
return 1
fi
return 0
}
# 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
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