LaTeX Container
Getting Started Dockerfile
user@system:~$ mkdir latexContainer && cd latexContainer
user@system:~/latexContainer$ vim Dockerfile
Dockerfile
FROM debian:stable-20190708-slim
MAINTAINER Matthias WAELTI <wlm2@bfh.ch>
RUN echo "Hello Docker"
Wir verwenden ein “base image” basierend auf debian stable vom 07.08.2019. “slim” verweisst auf die verwendeten Tools innerhalb der Distribution, wobei auf grafische Oberflächen und Benutzerhandbücher verzichtet wird.
user@system:~/latexContainer$ docker build .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM debian:stable-20190708-slim
stable-20190708-slim: Pulling from library/debian
161134cb67dc: Pull complete
Digest: sha256:fb24d5c869a1c878ed22840096d50f7d5459370f64a21191042e2b138244e8ae
Status: Downloaded newer image for debian:stable-20190708-slim
---> a4eb8e3265f8
Step 2/3 : MAINTAINER Matthias WAELTI <wlm2@bfh.ch>
---> Running in 37ec39a04673
Removing intermediate container 37ec39a04673
---> 3b2d651f9711
Step 3/3 : RUN echo "Hello Docker"
---> Running in 3a47e7213092
Hello Docker
Removing intermediate container 3a47e7213092
---> 6e64bd0ec3e4
Successfully built 6e64bd0ec3e4
Mit dem Kommando docker build .
wird auf der Basis eines Dockerfiles welches sich im “present working directory” befindet ein Docker-Image erstellt.
Da das Base-Image von debian nicht vorhanden ist, wird es nachgeladen und ist von nun an lokal verfügbar. Während des dritten Build-Steps sehen wir die Ausgabe “Hello Docker”.
user@system:~/latexContainer$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 6e64bd0ec3e4 2 minutes ago 69.2MB
debian stable-20190708-slim a4eb8e3265f8 2 weeks ago 69.2MB
Das Kommando docker image ls
listet alle vorhandenen Docker-Images auf. Eines der Images ist das debian Base-Image, das Andere ist das eben erstellte Image, welches noch keinen Namen trägt.
~:
$ docker build -t="cauchy/latex:1.0.0" .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM debian:stable-20190708-slim
---> a4eb8e3265f8
Step 2/3 : MAINTAINER Matthias WAELTI <wlm2@bfh.ch>
---> Using cache
---> 3b2d651f9711
Step 3/3 : RUN echo "Hello Docker"
---> Using cache
---> 6e64bd0ec3e4
Successfully built 6e64bd0ec3e4
Successfully tagged cauchy/latex:1.0.0
Nun wird das selbe Image erneut erstellt, dieses Mal jedoch mit einem Namen und einer Versionsnummer.
~:$ docker image ls --all
REPOSITORY TAG IMAGE ID CREATED SIZE
cauchy/latex 1.0.0 6e64bd0ec3e4 About an hour ago 69.2MB
<none> <none> 3b2d651f9711 About an hour ago 69.2MB
debian stable-20190708-slim a4eb8e3265f8 2 weeks ago 69.2MB
Werden nun alle Images gelistet, mit der Option --all
, so sehen wir nicht nur das Base-Image sondern auch das erste Image ohne Namen und das neue Image mit Namen und Versionsnummer.
LaTeX Dokerfile
Dockerfile>
FROM debian:stable-20190708-slim
MAINTAINER Matthias WAELTI <wlm2@bfh.ch>
ENV REFRESHED_AT 24.07.2019
RUN apt update && apt upgrade -y
RUN apt install -y make
RUN apt install -y doxygen \
doxygen-latex
RUN apt install -y texlive-base
Mit dem Befehl ENV
erstellen wir eine Environment-Variable welche zur Versionisierung dient. Anschliessend werden die Paketquellen aktuallisiert und ggf. Pakete erneuert. Für den Anfang werden die Pakete
make
doxygen
doxygen-latex
texlive-base
installiert.
Um das Verhalten von Doxygen und LaTex in einem Container zu untersuchen erstellen wir ein minimales C File welches wir dokumentieren wollen·
main.c
#include <stdio.h>
/*! \file */
/**
* @brief Simple "Hello World" function.
*
* This function will print a "Hello World" message to the standard output
* stream.
*
* @param No parameter.
* @return No return.
*/
void helloWorld(void)
{
puts("Hello World");
}
int main(void)
{
helloWorld();
}
Weiter wird ein minimales Config-File für doxygen benötig. Dafür kann mit dem Befehl
~:
$ doxygen -g <FILE_NAME>
eine standard Konfiguartionsdatei erstellt werden. Wir verwenden den Namen config.doxy
.
Nun werden einige minimale Veränderungen am config.doxy file vorgenommen. Die hier aufgelisteten Zeilen befinden sich nicht direkt nacheinander, sie sind aber bereits alle vorhanden und können gesucht werden.
PROJECT_NAME = "Hello World"
OUTPUT_DIRECTORY = _build
Nun können wir mit folgendem Befhel Doxygen und LaTex zuerst lokal testen:
doxygen config.doxy && make -C _build/latex/ && xdg-open _build/latex/refman.pdf
Nun wollen wir zuerst Doxygen alleine im Container ausführen, dazu setzten wir folgenden Befehl ab:
docker run --rm -v $(pwd):/usr/src -w /usr/src cauchy/latex:1.0.0 doxygen config.doxy
Befehle:
run
Startet einen Container--rm
Entfernt den Container nach Beendigung des Prozesses.-v $(pwd):/usr/src
Mountet den lokalen Ordner an den spezifizierten Pfad.-v <LOKALER_PFAD>:<CONTAINER_PFAD>
-w /usr/src
Legt das “Working-Direktory” im Container fest.cauchy/latex:1.0.0
Spezifiziert das Image auf dessen Grundlage der Container erstellt wird.doxygen config.doxy
Startet Doxygen mit der angegebenen Konfigurationsdatei.
Um die ganze Toolchain zu testen werden wir den Container nun mit der Option ‘’%%-it%%’’ im interaktiven Modus starten.
~:
$ docker run -it -v $(pwd):/usr/src cauchy/latex:1.0.0
So können wir die Befehle manuell absetzten.
root@ed6667ebe9fd:/# cd /usr/src/
root@ed6667ebe9fd:/usr/src# doxygen config.doxy
root@ed6667ebe9fd:/usr/src# make -C _build/latex/
root@ed6667ebe9fd:/usr/src# exit
exit
Mit dem Befehl exit
wird der Container verlassen.
Gitlab Registration
Nun wollen wir unseren Container auf GitLab registrieren. Dazu erstellen wir auf Gitlab eine Gruppe mit einem Projekt. Für das Projekt verwenden wir unser main.c File welches wir bisher genutzt haben.
Die Gruppe nennen wir “Docker Example” und das Projekt “myFirstBuildPipeline”. Im Projekt müssen nun unter Settings/General die Optionen “Pipelines” und “Container registry” eingeschaltet werden. Dadurch erscheint im linken Reiter eine neue Option “Container registry”. Dort können wir die erlaubten Nomenklaturen für die Container einsehen.
Da wir die bisher erstellten Images nicht mehr alle benötigen, entfernen wir nun alle Images, Container und Volumes mit dem Befehl:
docker system prune -a
Als nächstes bilden wir das Image neu “from scratch” mit dem richtigen Namen und Tag und “pushen” diesen zum Projekt. Doch zuerst müssen wir und mit docker bei GitLab anmelden:
docker login registry.gitlab.ti.bfh.ch
Anschliessend bilden wir das Image neu und pushen es.
docker build -t registry.gitlab.ti.bfh.ch/docker-example/myfirstbuildpipeline/latex:1.0.0 .
docker push registry.gitlab.ti.bfh.ch/docker-example/myfirstbuildpipeline/latex:1.0.0
Nach dem Neuladen der Seite sollte das registrierte Image auf GitLab erscheinen.
.gitlab-ci.yml File
Wir erstellen ein neues File mit dem Namen .gitlab-ci.yml
und dem folgenden Inhalt:
.gitlab-ci.yml
#image: registry.gitlab.ti.bfh.ch/docker-example/myfirstbuildpipeline/latex:1.0.0
stages:
- api-doc
make-doc:
stage: api-doc
tags:
- ubuntu
- center
image: registry.gitlab.ti.bfh.ch/docker-example/myfirstbuildpipeline/latex
script:
- ln -fs /usr/share/zoneinfo/right/Europe/Zurich /etc/localtime
- doxygen config.doxy
- make -C _build/latex
artifacts:
name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME"
when: on_success
paths:
- _build/latex/refman.pdf
Anschliessend kann das git Repositori bestehend aus
main.c
config.doxy
.gitlab-ci.yml
gepusht werden. Nun sollte die Pipeline fehlerfrei durchlaufen und am Ende die Artefakte zur Verfügung stehen.
UNSORTED TODO
~:
$ docker container ls
Listet alle vorhandenen Container.
~:
$ docker rm <CONTAINER_ID>
Entfernt einenen container.
~:
$ docker rm $(docker ps -a -q)
Entfernt alle bestehenden container.
~:
$ docker search <TAG>
Sucht nach einem docker Image mit dem spezifizierten TAG.
~:
$ docker search --filter "is-official=true" <TAG>
Sucht nach einem ofiziellen Image mit dem spezifizierten TAG.
A pre-built container can be found here: [[https://gitlab.ti.bfh.ch/latex-utils/texlive]]
docker pull registry.gitlab.ti.bfh.ch/latex-utils/texlive:latest
This docker container can also be used for CI/CD purposes within GitLab. An example ‘’.gitlab-ci.yml’’ could look as follows:
.gitlab-ci.yml
image: registry.gitlab.ti.bfh.ch/latex-utils/texlive:latest
variables:
GIT_SUBMODULE_STRATEGY: noraml
build:
script:
- MAINFILE=main.tex make document
artifacts:
paths:
- "_output/*.pdf"