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:
@@ -47,3 +47,5 @@ docker_run.sh
|
|||||||
# Fichiers de test
|
# Fichiers de test
|
||||||
documents/test.md
|
documents/test.md
|
||||||
|
|
||||||
|
# Documents sources (pour éviter de les copier dans l'image)
|
||||||
|
documents/*.md
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ ENV DEBIAN_FRONTEND=noninteractive \
|
|||||||
LC_ALL=fr_FR.UTF-8
|
LC_ALL=fr_FR.UTF-8
|
||||||
|
|
||||||
# Installation des dépendances système et locales
|
# Installation des dépendances système et locales
|
||||||
|
# Optimisation: combiner toutes les installations en une seule couche
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get install -y --no-install-recommends \
|
apt-get install -y --no-install-recommends \
|
||||||
locales \
|
locales \
|
||||||
@@ -22,17 +23,20 @@ RUN apt-get update && \
|
|||||||
texlive-latex-base \
|
texlive-latex-base \
|
||||||
texlive-xetex \
|
texlive-xetex \
|
||||||
texlive-fonts-recommended \
|
texlive-fonts-recommended \
|
||||||
|
texlive-latex-recommended \
|
||||||
texlive-latex-extra \
|
texlive-latex-extra \
|
||||||
|
texlive-fonts-extra \
|
||||||
texlive-lang-french \
|
texlive-lang-french \
|
||||||
fonts-dejavu \
|
fonts-dejavu \
|
||||||
|
lmodern \
|
||||||
cups \
|
cups \
|
||||||
cups-client \
|
cups-client \
|
||||||
evince \
|
evince \
|
||||||
curl \
|
curl \
|
||||||
ca-certificates \
|
ca-certificates \
|
||||||
make \
|
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é
|
# Création d'un utilisateur non-root pour sécurité
|
||||||
RUN useradd -m -u 1000 -s /bin/bash mdprint && \
|
RUN useradd -m -u 1000 -s /bin/bash mdprint && \
|
||||||
@@ -55,4 +59,3 @@ USER mdprint
|
|||||||
# Point d'entrée
|
# Point d'entrée
|
||||||
ENTRYPOINT ["/usr/local/bin/md_to_print.sh"]
|
ENTRYPOINT ["/usr/local/bin/md_to_print.sh"]
|
||||||
CMD ["--help"]
|
CMD ["--help"]
|
||||||
|
|
||||||
|
|||||||
178
docker_run.sh
178
docker_run.sh
@@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
# Wrapper pour exécuter le script MD_to_Print dans Docker
|
# Wrapper pour exécuter le script MD_to_Print dans Docker
|
||||||
# Usage: ./docker_run.sh fichier.md [options...]
|
# Usage: ./docker_run.sh fichier.md [options...]
|
||||||
|
# ./docker_run.sh fichier1.md fichier2.md [options...]
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
MD_FILE="${1:-}"
|
|
||||||
|
|
||||||
# Couleurs
|
# Couleurs
|
||||||
RED='\033[0;31m'
|
RED='\033[0;31m'
|
||||||
@@ -21,17 +21,20 @@ show_help() {
|
|||||||
Wrapper Docker pour MD_to_Print
|
Wrapper Docker pour MD_to_Print
|
||||||
|
|
||||||
Usage: $0 fichier.md [options...]
|
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:
|
Ce script simplifie l'exécution de MD_to_Print dans Docker en gérant:
|
||||||
- Les chemins absolus des fichiers
|
- Les chemins absolus des fichiers
|
||||||
- Le montage des volumes
|
- Le montage des volumes
|
||||||
- Le passage des arguments
|
- Le passage des arguments
|
||||||
- La gestion des erreurs Docker
|
- La gestion des erreurs Docker
|
||||||
|
- Le traitement de plusieurs fichiers en boucle
|
||||||
|
|
||||||
EXEMPLES:
|
EXEMPLES:
|
||||||
$0 documents/rapport.md --preview
|
$0 documents/rapport.md --preview
|
||||||
$0 documents/rapport.md --printer HP_LaserJet --copies 2
|
$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:
|
OPTIONS:
|
||||||
Toutes les options de md_to_print.sh sont supportées.
|
Toutes les options de md_to_print.sh sont supportées.
|
||||||
@@ -40,10 +43,40 @@ OPTIONS:
|
|||||||
EOF
|
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
|
# 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
|
show_help
|
||||||
exit 0
|
exit 0
|
||||||
|
else
|
||||||
|
echo -e "${RED}Erreur: Aucun fichier markdown spécifié${NC}"
|
||||||
|
show_help
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Vérifier que Docker est disponible
|
# Vérifier que Docker est disponible
|
||||||
@@ -52,25 +85,13 @@ if ! command -v docker &> /dev/null; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Vérifier que le fichier existe
|
# Vérifier que tous les fichiers existent
|
||||||
if [ ! -f "$MD_FILE" ]; then
|
for MD_FILE in "${MD_FILES[@]}"; do
|
||||||
|
if [ ! -f "$MD_FILE" ]; then
|
||||||
echo -e "${RED}Erreur: Le fichier '$MD_FILE' n'existe pas${NC}"
|
echo -e "${RED}Erreur: Le fichier '$MD_FILE' n'existe pas${NC}"
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
|
done
|
||||||
# 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
|
|
||||||
|
|
||||||
# Créer les répertoires nécessaires
|
# Créer les répertoires nécessaires
|
||||||
mkdir -p "$SCRIPT_DIR/documents" "$SCRIPT_DIR/output" "$SCRIPT_DIR/logs"
|
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 .
|
docker build -t md-to-print:latest .
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Construire la commande Docker
|
# Fonction pour traiter un fichier
|
||||||
DOCKER_CMD=(
|
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
|
docker run
|
||||||
--rm
|
--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/documents:/workspace/documents:ro"
|
||||||
-v "$SCRIPT_DIR/output:/workspace/output"
|
-v "$SCRIPT_DIR/output:/workspace/output"
|
||||||
-v "$SCRIPT_DIR/logs:/workspace/logs"
|
-v "$SCRIPT_DIR/logs:/workspace/logs"
|
||||||
--network host
|
--network host
|
||||||
)
|
)
|
||||||
|
|
||||||
# Ajouter le support X11 si DISPLAY est défini (pour prévisualisation)
|
# Ajouter le support X11 si DISPLAY est défini (pour prévisualisation)
|
||||||
if [ -n "${DISPLAY:-}" ]; then
|
if [ -n "${DISPLAY:-}" ]; then
|
||||||
DOCKER_CMD+=(
|
DOCKER_CMD+=(
|
||||||
-e DISPLAY="$DISPLAY"
|
-e DISPLAY="$DISPLAY"
|
||||||
-v /tmp/.X11-unix:/tmp/.X11-unix:ro
|
-v /tmp/.X11-unix:/tmp/.X11-unix:ro
|
||||||
)
|
)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Ajouter l'accès CUPS si disponible
|
# Ajouter l'accès CUPS si disponible
|
||||||
if [ -d "/var/run/cups" ]; then
|
if [ -d "/var/run/cups" ]; then
|
||||||
DOCKER_CMD+=(-v /var/run/cups:/var/run/cups:ro)
|
DOCKER_CMD+=(-v /var/run/cups:/var/run/cups:ro)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
DOCKER_CMD+=(md-to-print:latest)
|
DOCKER_CMD+=(md-to-print:latest)
|
||||||
|
|
||||||
# Ajouter le fichier markdown et les options
|
# Ajouter le fichier markdown
|
||||||
if [[ "$MD_DIR" == "$SCRIPT_DIR" ]]; then
|
if [[ "$MD_DIR" == "$SCRIPT_DIR" ]]; then
|
||||||
DOCKER_CMD+=("/workspace/$MD_NAME")
|
DOCKER_CMD+=("/workspace/$MD_NAME")
|
||||||
else
|
else
|
||||||
DOCKER_CMD+=("/workspace/documents/$MD_NAME")
|
DOCKER_CMD+=("/workspace/documents/$MD_NAME")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Ajouter les options restantes
|
# Ajouter les options
|
||||||
shift
|
for opt in "${FILE_OPTIONS[@]}"; do
|
||||||
for arg in "$@"; do
|
DOCKER_CMD+=("$opt")
|
||||||
DOCKER_CMD+=("$arg")
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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
|
done
|
||||||
|
|
||||||
# Exécuter
|
if [ $EXIT_CODE -eq 0 ]; then
|
||||||
echo -e "${GREEN}Exécution dans Docker...${NC}"
|
echo -e "${GREEN}=== Tous les fichiers ont été traités avec succès ===${NC}"
|
||||||
echo -e "${BLUE}Commande: ${DOCKER_CMD[*]}${NC}"
|
else
|
||||||
echo ""
|
echo -e "${YELLOW}=== Certains fichiers ont échoué ===${NC}"
|
||||||
|
fi
|
||||||
exec "${DOCKER_CMD[@]}"
|
|
||||||
|
|
||||||
|
exit $EXIT_CODE
|
||||||
|
|||||||
Reference in New Issue
Block a user