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ôle.
Il existe deux sortes de conteneur :
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 Dockerfile.
Les commentaires sont précédés du croisillon (#).
ADD.
Permet de copier des fichiers ou dossiers de la machine hôte vers le conteneur.
ARG.
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
CMD.
Commande à exécuter au lancement du conteneur.
COPY.
Copie des fichiers ou dossiers de la machine hôte vers le conteneur.
Ainsi, l'image les embarquera (contrairement à s'ils étaient montés dans un volume).
Ex :
 COPY entrypoint.sh /usr/local/bin/entrypoint.sh
La différence avec codice_1 est qu'il ne prend pas en compte les décompression de .tar et les URLs distantes.
ENTRYPOINT.
Nom d'un fichier exécutable (par exemple en shell) qui s'exécutera après chaque lancement du conteneur.
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 codice_2 qui peut la lire sans y écrire).
ENV.
Crée une variable d'environnement accessible à toutes les images du Dockerfile.
EXPOSE.
Ouvre le port logiciel mentionné du conteneur.
FROM.
Part d'une image Docker pour en créer une autre qui la complète.
Cela permet par exemple le "" : 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.
LABEL.
Ajoute une description à une image.
RUN.
Lance une commande. Ex :
 RUN ls
STOPSIGNAL.
Signal d'arrêt à envoyer au conteneur, au format nombre ou nom. Par exemple pour le tuer.
USER.
Se connecte à l'utilisateur et mot de passe en paramètre pour lancer les instructions codice_3, codice_4 ou codice_5.
Par ailleurs, pour que le conteneur possède les permissions de l'utilisateur courant :
 docker --user $(id -u):$(id -g)
Utilisation dans Docker Compose.
Puis au lancement :
 CURRENT_UID=$(id -u):$(id -g) docker compose up -d
La présence de l'opérateur ":" dans les accolades signifie que l'on bascule vers cet utilisateur si la variable est inconnue du .env. Par exemple pour utiliser l'UID 1000 si codice_6 n'est pas renseigné dans le .env :
VOLUME.
Point de montage accessible par l'hôte et les autres conteneurs.
WORKDIR.
Définit le répertoire de travail, c'est-à-dire celui à partir duquel les commandes partent (ex : codice_7), y compris quand on se connecte au conteneur après son montage.
Équivalent à codice_8.
.dockerignore.
Un fichier .dockerignore peut être placé dans un dépôt pour que son conteneur ignore le contenu qui y figure lors des commandes codice_1 et codice_2. Exemple pour Symfony :
node_modules/*
var/*
vendor/*
Bonnes pratiques.
Voir https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
Exemples.
Apache avec PHP7.1.
Voici un exemple de serveur Apache avec PHP7.1 pour MediaWiki :
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
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
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"]
Nginx avec PHP-FPM 8.2.
FROM php:8.2-fpm
ENV TZ=Europs/Paris
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get update && apt-get install -y \
 libxml2-dev \
 libicu-dev \
 libcurl3-dev \
 libsqlite3-dev \
 libedit-dev \
 zlib1g-dev \
 libfreetype6-dev \
 libjpeg62-turbo-dev \
 libmemcached-dev \
 libzip-dev \
 libonig-dev \
 libpq-dev
RUN docker-php-ext-install \
 intl \
 pdo_mysql \
 pdo_pgsql \
 opcache \
 bcmath \
 soap \
 sockets \
 zip \
 && docker-php-ext-configure gd \
 && docker-php-ext-install -j$(nproc) gd
RUN pecl install -f xdebug \
 && export XDEBUG_PATH=`find / -name "xdebug.so"`
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
WORKDIR /var/www/myApp
CMD ["php-fpm"]