Docker/Dockerfile


Une fois le processus Docker lancé, on peut commencer à lui demander de construire des conteneurs, de zéro ou à partir d'images d'un registre.

RôleModifier

Il existe deux sortes de conteneur :

  • Celui issu d'une image téléchargée et utilisée telle qu'elle.
  • Celui construit avec des instructions personnalisées.

Par convention, les instructions pour construire un conteneur sont écrites dans un fichier appelé "Dockerfile". Il est recommandé de les placer dans un dépôt Git pour les versionner.

Commandes DockerfileModifier

Les commentaires sont précédés du croisillon (#).

ADDModifier

Permet de copier des fichiers ou dossiers de la machine hôte vers le conteneur[1].

  Les Dockerfile n’ont jamais accès aux volumes de l'hôte, sauf dans l’ENTRYPOINT.


ARGModifier

Crée une variable qui sera accessible dans la première image (FROM). Ex :

ARG NODE_VERSION=10
...
RUN curl -sL https://deb.nodesource.com/setup_${NODE_VERSION}.x | bash
  Éviter d'utiliser ce système pour bénéficier du build cache : ainsi Docker ne retéléchargera pas toutes les dépendances du Dockerfile lors du changement d'une variable située en début de Dockerfile, et n'affectant qu'une seule d'entre elles.


COPYModifier

Copie des fichiers ou dossiers de la machine hôte vers le conteneur[2]. Ainsi, l'image les embarquera (contrairement à s'ils étaient montés dans un volume).

Ex :

COPY entrypoint.sh /usr/local/bin/entrypoint.sh

ENTRYPOINTModifier

Nom d'un fichier exécutable (par exemple en shell) qui s'exécutera après chaque lancement du conteneur[3].

Ex :

ENTRYPOINT /usr/local/bin/entrypoint.sh

Le fichier exécuté par l'entrypoint est le principal moyen d'accéder à la machine hôte, puisque le Dockerfile ne peut pas (en dehors de COPY).

ENVModifier

Crée une variable d'environnement accessible à toutes les images du Dockerfile[4].

EXPOSEModifier

Ouvre le port logiciel mentionné du conteneur[5].

FROMModifier

Part d'une image Docker pour en créer une autre qui la complète[6].

Cela permet par exemple le multistage build : se servir d'une première image comme builder volumineux (avec des sources, des dépendances nécessaires à des installations), duquel on copie seulement les fichiers à utiliser dans une autre image plus légère, qui sera montée en conteneur[7].

LABELModifier

Ajoute une description à une image[8].

RUNModifier

Lance une commande. Ex :

RUN ls

STOPSIGNALModifier

Signal d'arrêt à envoyer au conteneur, au format nombre ou nom. Par exemple SIGKILL pour le tuer.

USERModifier

Se connecte à l'utilisateur et mot de passe en paramètre pour lancer les instructions RUN, CMD ou ENTRYPOINT[9].

VOLUMEModifier

Point de montage accessible par l'hôte et les autres conteneurs[10].

WORKDIRModifier

Définit le répertoire de travail, c'est-à-dire celui à partir duquel les commandes partent (ex : pwd), y compris quand on se connecte au conteneur après son montage.

.dockerignoreModifier

Un fichier .dockerignore peut être placé dans un dépôt pour que son conteneur ignore le contenu qui y figure lors des commandes ADD et COPY. Exemple pour Symfony :

node_modules/*
var/*
vendor/*

Bonnes pratiquesModifier

Voir https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

Exemple d'image construiteModifier

Voici un exemple de serveur Apache avec PHP7.1[11] :

FROM debian:sid

ENV TZ=Europs/Paris
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

ENV MEDIAWIKI_VERSION wmf/1.30.0-wmf.4

# XXX: Consider switching to nginx.
RUN set -eux; \
	apt-get update; \
	apt-get install -y --no-install-recommends \
		ca-certificates \
		apache2 \
		libapache2-mod-php7.1 \
		php7.1-mysql \
		php7.1-cli \
		php7.1-gd \
		php7.1-curl \
		php7.1-mbstring \
		php7.1-xml \
		imagemagick \
		netcat \
		git \
	; \
	rm -rf /var/lib/apt/lists/*; \
	rm -rf /var/cache/apt/archives/*; \
	a2enmod rewrite; \
	a2enmod proxy; \
	a2enmod proxy_http; \
	# Remove the default Debian index page.
	rm /var/www/html/index.html


# MediaWiki setup
RUN set -eux; \
	mkdir -p /usr/src; \
	git clone \
		--depth 1 \
		-b $MEDIAWIKI_VERSION \
		https://gerrit.wikimedia.org/r/p/mediawiki/core.git \
		/usr/src/mediawiki \
	; \
	cd /usr/src/mediawiki; \
	git submodule update --init skins; \
	git submodule update --init vendor; \
	cd extensions; \
	# Extensions
	# TODO: make submodules shallow clones?
	git submodule update --init --recursive VisualEditor; \
	git submodule update --init --recursive Math; \
	git submodule update --init --recursive EventBus; \
	git submodule update --init --recursive Scribunto; \
	git submodule update --init --recursive ParserFunctions; \
	git submodule update --init --recursive SyntaxHighlight_GeSHi; \
	git submodule update --init --recursive Cite; \
	git submodule update --init --recursive Echo; \
	git submodule update --init --recursive Flow; \
	git submodule update --init --recursive PageImages; \
	git submodule update --init --recursive TextExtracts; \
	git submodule update --init --recursive MobileFrontend; \
	git submodule update --init --recursive TemplateData; \
	git submodule update --init --recursive ParserFunctions; \
	git submodule update --init --recursive Citoid


COPY php.ini /usr/local/etc/php/conf.d/mediawiki.ini

COPY apache/mediawiki.conf /etc/apache2/
RUN echo "Include /etc/apache2/mediawiki.conf" >> /etc/apache2/apache2.conf

COPY docker-entrypoint.sh /entrypoint.sh

EXPOSE 80 443
ENTRYPOINT ["/entrypoint.sh"]
CMD ["apachectl", "-e", "info", "-D", "FOREGROUND"]

RéférencesModifier