Montage volume Docker

Résolu
vivien45 - 25 sept. 2023 à 18:53
 vivien45 - 28 sept. 2023 à 09:45

Bonjour, j'essai de faire un docker apache2 mais je n'arrive pas à mapper le chemin /var/www/html de mon docker vers le /opt/apache de mon hote ou plutôt il est monté mais vide est-ce qu'une logique m'échappe ?

les fichiers :

html.pem /etc/ssl/certs
html.key /etc/ssl/certs
default-ssl.conf

sont bien présents dans le dossier où est situé le Dockerfile

Voici mon Dockerfile :

FROM debian:11

RUN apt-get update && apt-get install -y apt-utils apache2 php libapache2-mod-php php-mysql php-pgsql php-fpm php-mbstring php-curl php-cli php-gd php-intl php-xml php>

EXPOSE 80
EXPOSE 443

VOLUME /etc/apache2
COPY html.pem /etc/ssl/certs
COPY html.key /etc/ssl/certs
COPY default-ssl.conf /etc/apache2/sites-available

ENV APACHE_RUN_DIR=/var/run/apache2

RUN a2ensite default-ssl.conf
RUN a2enmod ssl
CMD ["apache2ctl","-D","FOREGROUND"]
A voir également:

2 réponses

avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 498
25 sept. 2023 à 21:51

Bonjour,

Les images Docker sont généralement conçues pour être autant réutilisables que possible, il serait préférable de monter les fichiers certificat/clé et non de les inclure dans l'image.

je n'arrive pas à mapper le chemin /var/www/html de mon docker vers le /opt/apache

C'est plutôt l'inverse, on mappe un dossier hôte vers le container. Peut-être que cette confusion est liée au problème rencontré...

Quelques précisions seront nécessaires pour pouvoir t'aider :

  1. Sur l'hôte, quel est le contenu de /opt/apache ?
    ls -l /opt/apache
  2. Quelle commande utilises-tu pour lancer le Docker ?
    La commande devrait contenir "-v /opt/apache:/var/www/html"
  3. Si tu listes le contenu depuis le container ? Avec quelque-chose comme :
    docker exec -it NomDuContainer ls -l /var/www/html
0

Bonjour, merci pour ta réponse. En effet je me suis trompe dans mon explication, c'est l'inverse que je voulais dire. Pour répondre à ta question, je lance la commande suivante :

sudo docker run --name conteneur -v /opt/owncloud:/var/www/html -d -p 80:80 contenu

"contenu" est le nom que j'ai donné à mon image.

Ensuite Sur l'hôte, quel est le contenu de /opt/apache?

Le dossier sur l'hôte est vide

0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 498
Modifié le 26 sept. 2023 à 14:42

Bonjour,

Si le dossier /opt/owncloud sur l'hôte est vide avant le démarrage du container, alors son équivalent dans le container (/var/www/html) sera vide aussi.

Avant de démarrer le container, tu dois placer les fichiers owncloud dans /opt/owncloud

0
vivien45 > avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024
26 sept. 2023 à 19:44

C'est ca que je ne comprend pas. Dans l'exemple du docker mariadb je le monte comme suit:

docker run --name some-mariadb -v /opt/mariadb:/var/lib/mysql -h dock-mariadb -e MARIADB_ROOT_PASSWORD=root -p3306:3306 -d mariadb

et le dossier /opt/mariadb se rempli avec le contenu du docker s'il est vide et s'il ne l'est pas, le conteneur reprend le contenu de /opt/mariadb et je retrouve l'intégralité de mes données stockes en Database. Du coup je me pose des questions notamment quelle logique m'échappe et/ou qu'est-ce que je n'ai pas fait correctement pour que mon image agisse de la sorte. Et merci à toi du temps que tu m'accorde.

0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 498 > vivien45
27 sept. 2023 à 22:19

Bonjour,

C'est tout simplement parce que l'image MariaDB est conçue pour générer le contenu initial au premier démarrage (et non lors du build) du container si le dossier apparaît vide.

Ton image pour Apache n'a aucune raison de faire cela. En fait, au moment du build, il est possible que l'installation de Apache installe aussi des fichiers dans le dossier /var/www/html de l'image

Néanmoins, au moment où tu démarres le container, tu fais un bind "-v /opt/apache:/var/www/html" alors que le dossier /opt/apache est vide, il en résulte que /var/www/html est vide également (donc au niveau du container, même si l'image de base contient quelque-chose).

Le contenu du dossier hôte /opt/apache (vide) prend le "dessus" sur le contenu /var/www/html (peut-être rempli) du container.

C'est expliqué dans la documentation :

If you bind-mount a directory into a non-empty directory on the container, the directory's existing contents are obscured by the bind mount.

Voir https://docs.docker.com/storage/bind-mounts/#mount-into-a-non-empty-directory-on-the-container

Cette phrase parle du côté où le dossier hôte contient quelque-chose, et le dossier container aussi.
Mais techniquement, la même chose se passe si le dossier hôte est vide et si le dossier container est contient quelque-chose ou pas.

De mémoire, l'image officielle de Nextcloud fonctionne comme celle de MariaDB : au premier démarrage, tu montes un dossier hôte vide dans le container à l'emplacement imposé, et un script (dans l'image) détecte que si ce dossier est vide, alors il faut télécharger Nextcloud et l'extraire dans ce dossier. Et puisque ce dossier est un mount avec le dossier hôte, les fichiers apparaissent alors sur le dossier hôte (en dehors du container).

0
vivien45 > avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024
28 sept. 2023 à 09:45

Bonjour, Ah d'accord comprend bien mieux la logique. Merci à toi pour tes lumières et pour le temps que tu m'as accordé.

0