L'autre jour, j'ai présenté un conteneur Docker qui intègre Apache et Pandoc → Version locale
C'était une méthode pour placer le fichier source dans le conteneur ou dans le répertoire de l'hôte où le conteneur s'exécute. Au lieu de cela, j'ai créé un conteneur (version distante) qui peut être utilisé lorsque la ressource Web contenant la source Markdown que je souhaite fournir est en dehors de l'hôte du conteneur, c'est-à-dire à distance, donc je la publierai.
Les fichiers Docker et autres sources sont publiés sur github, et les images Docker créées sont publiées sur Docker Hub (voir fin).
Ci-dessous, je vais omettre les sujets communs avec la version locale précédente.
Apache
Dans le cas de la version locale, le contenu de la source Markdown (extension md
) qui existe réellement dans le répertoire sous Apache est passé à l'entrée standard du filtre.
Cependant, cette méthode ne peut pas être utilisée si le fichier Markdown n'existe pas dans le répertoire local sous Apache.
Apache dispose d'un mécanisme appelé gestionnaire d'actions qui appelle un script CGI pré-spécifié lorsqu'il y a une demande de chemin d'URL avec une extension spécifique. Le chemin demandé n'a pas besoin d'être dans votre répertoire local.
À l'aide de ce mécanisme, j'ai créé un gestionnaire qui lit la source Markdown à partir d'un serveur Web autre que le conteneur et la convertit en HTML.
Spécifiez un gestionnaire d'actions nommé pandoc-handler
dans la configuration Apache suivante.
[local.conf]
LoadModule cgid_module modules/mod_cgid.so
LoadModule actions_module modules/mod_actions.so
AddHandler markdown-text .md
Action markdown-text /cgi-bin/pandoc-handler virtual
SetEnv REMOTE_DIR https://elsewhere.com/docker
Je vais expliquer.
--Charger mod_actions
, qui rend les gestionnaires d'actions disponibles dans LoadModule
, et mod_cgid
, qui rend les scripts CGI disponibles.
--Définissez les directives AddHandler
et Action
pour appeler le script CGI pandoc-handler
lorsque le fichier spécifié dans le chemin de l'URL a l'extension md
.
--SetEnv est la spécification du répertoire distant expliquée dans la section suivante.
Dans l'image de base
httpd: 2.4
, l'URL '/ cgi-bin' est précédemment associée au répertoire d'exécution du script '/ usr / local / apache2 / cgi-bin', utilisez donc ceci.
J'ai créé un gestionnaire Apache qui appelle Pandoc. Il s'agit d'un script shell Bash qui convertit la source Markdown obtenue d'Apache en fonction du chemin d'URL passé dans la variable d'environnement PATH_INFO avec Pandoc et génère le HTML vers la sortie standard.
Selon l'application, il existe différentes manières de lire (ou de générer) la source Markdown à partir du chemin URL demandé. Lire à partir d'un service de fichiers cloud, lire à partir d'une base de données, obtenir à partir d'un référentiel git distant, obtenir avec sftp, et plus encore.
Cet exemple lit le fichier source Markdown à partir du répertoire distant vers lequel pointe l'URL fixe.
Utilisez la commande curl
pour lire le fichier Markdown à partir de la variable d'environnement REMOTE_DIR
définie dans la section précédente.
[pandoc-handler]
#!/bin/bash
BASENAME=$(basename -s .md $PATH_INFO)
curl -s $REMOTE_DIR$PATH_INFO | /usr/bin/pandoc -f gfm -t html5 -c "/pandoc-gfm.css" \
-T "Converted" -M title=${BASENAME}
Je vais expliquer.
PATH_INFO
.
--Obtenir le fichier spécifié avec curl
depuis le serveur Web distant spécifié dans la variable d'environnement REMOTE_DIR
dans la section précédente.
--Convertir en HTML avec pandoc
et sortie en sortie standardExemple d'acquisition:
Créez un conteneur Docker qui incorpore le fichier de configuration Apache et le script de gestionnaire ci-dessus.
$ ls
Dockerfile
usr-local-apache2/
$ ls usr-local-apache2
local.conf
pandoc-handler
$ cat Dockerfile
FROM httpd:2.4
RUN apt-get update && apt-get install -y \
pandoc \
curl \
ca-certificates
COPY ./usr-local-apache2 /usr/local/apache2/
RUN echo 'Include local.conf' >> /usr/local/apache2/conf/httpd.conf
$ docker build -t pandoc:remote .
Comme précédemment, récupérez l'image de base httpd
comprenant Linux et Apache depuis le hub Docker officiel dans FROM.
Contrairement à la dernière fois, RUN obtient «curl» en plus de «pandoc».
ca-certificate
était nécessaire pour utiliser SSL avec curl.
Comme précédemment, copiez le fichier de configuration Apache et le gestionnaire d'actions (script CGI) à l'emplacement approprié dans le conteneur avec COPY, et exécutez la commande de construction Docker.
Une fois que vous avez un conteneur Docker, essayez de l'exécuter sur l'hôte créé.
$ docker run --detach -publish 8080:80 pandoc:remote
Contrairement au filtre précédent, il n'utilise pas le répertoire local, il n'y a donc pas d'option --mount
.
Assignez le port avec l'option --public
comme auparavant.
Tout d'abord depuis la machine hôte exécutant le conteneur:
$ curl localhost:8080/test.md
Ensuite, accédez-y avec un navigateur depuis l'extérieur de la machine hôte.
http://example.com:8080/test.md
Si le fichier Markdown qui aurait dû être placé à 'https: //elsewhere.com/docker/test.md' est affiché en HTML, il réussit.
Ensuite, j'ai essayé d'exécuter ce conteneur Docker avec ECS (Elastic Container Service), l'un des services de conteneur d'Amazon AWS. La prochaine fois, j'écrirai les détails.
La source de Dockerfile, du fichier de configuration Apache et du filtre Apache est publiée sur github. Vous pouvez créer un conteneur par git clone et docker build.
L'image créée peut également être obtenue à partir de Docker Hub.
Written 2020/09/22
Recommended Posts