web-dev-qa-db-fra.com

Copier des fichiers dans un conteneur avec Docker Compose

J'ai un Dockerfile où je copie un répertoire existant (avec le contenu) dans le conteneur qui fonctionne bien:

Dockerfile

FROM php:7.0-Apache
COPY Frontend/ /var/www/html/aw3somevideo/
COPY Frontend/ /var/www/html/

RUN ls -al /var/www/html
RUN chown -R www-data:www-data /var/www/html 
RUN chmod -R 755 /var/www/html 

Screenshot of directory listing with docker exec

Mais lorsque j'utilise un fichier docker-compose.yml, il n'y a que le répertoire aw3somevideo et à l'intérieur de aw3somevideo, il n'y a rien.

docker-compose.yml :

 php:
    build: php/
    volumes:
      - ./Frontend/ :/var/www/html/
      - ./Frontend/index.php :/var/www/html/
    ports:
      - 8100:80

Screenshot of empty directory listing

Peut-être que je ne comprends pas la fonction de volumes et si tel est le cas, dites-moi comment copier mes fichiers existants dans le conteneur via un fichier docker-compose.yml.

58
TheDoctor

Mis à jour en avril 2017

Le comportement a changé depuis que j'ai écrit la réponse originale. Il est maintenant cohérent que le côté droit spécifie un volume nommé tel que myvolume ou un chemin sur l'hôte tel que /var/lib/myapp. Par exemple

    volumes:
      - /dir/on/Host:/var/www/html

si /dir/on/Host n'existe pas, il est créé sur l'hôte et le contenu vide est monté dans le conteneur sous /var/www/html. Tout ce qui était dans /var/www/html avant est inaccessible.

---- vieille réponse -----------

La section volumes: de votre composition de docker écrase tout ce qui se trouve dans le répertoire /var/www/html.

Il y a deux situations principales:

  1. Le volume existe

    Dans ce cas, le contenu du volume occulte tout ce qui se trouve dans le répertoire dst.

    Par exemple:

    volumes:
      - /dir/on/Host:/var/www/html
    
  2. Le volume n'existe pas

    Si myvolume n'existe pas (un volume nommé par exemple), le contenu de/var/www/html sera copié dans le volume la première fois

    volumes:
      - myvolume:/var/www/html
    

Dans le cas 2, si vous essayez de monter à nouveau le même volume sur un conteneur, le cas 1 sera suivi.

    volumes:
      - myvolume:/var/www/html

Dans ce cas (en supposant que mon volume a déjà été créé), le contenu de/var/ww/html sera écrasé (masqué) par tout ce qui se trouve dans myvolume.

Le document officiel va dans plus de détails https://docs.docker.com/compose/compose-file/#/volumes-volume-driver

44
Bernard