J'essaie mes premiers pas dans Docker, j'ai donc essayé de créer un Dockerfile qui crée un index.html simple et des images de répertoire (voir le code ci-dessous)
Ensuite, j'exécute la construction docker-compose pour créer l'image, et docker-compose-up pour exécuter le serveur. Mais je n'obtiens aucun fichier index.html ou images de dossier.
Voici mon Dockerfile:
FROM php:Apache
MAINTAINER [email protected]
WORKDIR /var/www/html
RUN touch index.html \
&& mkdir images
Et voici mon docker-compose.yml
version: '2'
services:
web:
build: .docker/web
ports:
- "80:80"
volumes:
- ./docroot:/var/www/html
Je m'attendrais à ce que cela crée un dossier docroot avec un répertoire d'images et un index.html, mais je n'obtiens que le docroot.
Le Dockerfile contient des instructions sur la façon de créer une image. L'image que vous avez créée à partir de ce Dockerfile contient contient index.html
et images/
.
Au moment de l'exécution, vous avez créé un conteneur à partir de l'image que vous avez créée. Dans ce conteneur, vous avez monté le répertoire externe ./docroot
comme /var/www/html
.
Une monture masquera tout ce qui se trouvait auparavant sur ce chemin, donc cette monture masquera le contenu antérieur de /var/www/html
, en les remplaçant par ce qui se trouve dans ./docroot
.
Dans les commentaires que vous avez demandés
y a-t-il une possibilité de monter puis de créer des fichiers ou quelque chose? Ou est-ce impossible?
La façon dont vous avez fait les choses, vous avez monté sur vos fichiers d'origine, donc ils ne sont plus accessibles une fois le conteneur créé.
Il existe plusieurs façons de gérer cela.
Si vous placez ces fichiers dans un chemin différent dans votre image, ils ne seront pas écrasés par le montage.
WORKDIR /var/www/alternate-html
RUN touch index.html \
&& mkdir images
WORKDIR /var/www/html
À l'exécution, vous aurez toujours cette monture à /var/www/html
, qui contiendra le contenu du répertoire externe. Qui peut ou non être un répertoire vide. Vous pouvez dire au conteneur au démarrage d'exécuter un script et de copier les choses là-bas, si c'est ce que vous voulez.
COPY entrypoint.sh /entrypoint.sh
RUN chmod 0755 /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
(Cela suppose que vous n'avez pas de point d'entrée défini - si vous en avez, vous devrez peut-être simplement ajuster votre script existant à la place.)
entrypoint.sh:
#!/bin/sh
cp -r /var/www/alternate-html/* /var/www/html
exec "$@"
Cela exécutera la commande cp
, puis passera le contrôle à la valeur de CMD
pour cette image.
Vous avez également la possibilité de préremplir simplement les fichiers souhaités dans ./docroot
en externe. Ensuite, ils seront juste là lorsque le conteneur démarre et ajoute le montage de répertoire.