Kopieren von Dateien in einen Container mit Docker Compose

94

Ich habe ein, Dockerfilewo ich ein vorhandenes Verzeichnis (mit Inhalt) in den Container kopiere, was gut funktioniert:

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 der Verzeichnisliste mit Docker Exec

Aber wenn ich eine docker-compose.ymlDatei benutze , gibt es nur das Verzeichnis aw3somevideound darin aw3somevideoist nichts.

docker-compose.yml :

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

Screenshot der leeren Verzeichnisliste

Vielleicht verstehe ich die Funktion von nicht volumesund wenn dies der Fall ist, sagen Sie mir bitte, wie ich meine vorhandenen Dateien über eine docker-compose.ymlDatei in den Container kopieren soll .

Der Doktor
quelle
4
Entfernen Sie Ihren volumes:Abschnitt aus Ihrer Docker-Compose-Datei. Ihr Bild enthält bereits die Daten. Der Abschnitt volume: überschreibt nur die Daten. Wechseln Sie auch zum aktuellen Docker-Compose-Format (Version 2).
Bernard
@ Alkaline thx das war wirklich das Problem. Aber warum haben Volumes nicht das gesamte Verzeichnis kopiert?
TheDoctor
Ich werde als Antwort antworten, damit Sie dieses Problem schließen.
Bernard

Antworten:

79

Gegeben

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

Wenn /dir/on/hostes nicht vorhanden ist, wird es auf dem Host erstellt und der leere Inhalt wird im Container unter bereitgestellt /var/www/html. Auf den Inhalt, den Sie zuvor im /var/www/htmlContainer hatten, kann nicht zugegriffen werden, bis Sie das Volume aushängen. Das neue Mount versteckt den alten Inhalt.

Bernard
quelle
Ist es möglich, dass mit neueren Docker-Versionen der Inhalt von var/www/html/nicht mehr kopiert wird, /dir/on/hostauch wenn er nicht existiert? Gibt es eine Möglichkeit, das Kopieren der Daten aus dem Docker-Container auf den Host zu erzwingen, wenn ein Container zum ersten Mal gestartet wird?
Tarator
1
@ Tarator ja ja, die rechte Seite wird nicht mehr auf den Host kopiert. Ich werde die Antwort aktualisieren. Um beim Start des Containers zu kopieren, können Sie den Startbefehl mit so etwas überschreiben docker run -v /dir/on/host:/hostdir php sh -c "cp -rp /var/www/html/* /hostdir && exec myapp". Vergessen Sie nicht, execden letzten Befehl so aufzurufen, dass ihm PID1 zugewiesen wird. Dadurch wird sichergestellt, dass myapp Beendigungssignale empfängt (z. B. Strg-C).
Bernard
Hallo, ich versuche auch das gleiche mit Docker-Compose, bekomme aber einen Fehler. Kannst du es dir bitte ansehen ... stackoverflow.com/questions/45573831/…
utkarsh31
Hey, Bernard, in Ihrer Antwort beziehen Sie sich auf " ob die rechte Seite ein benanntes Volume wie myvolume oder einen Pfad auf dem Host angibt" . Meinten Sie dort nicht "linke Hand", da man dort entweder einen Volume- oder einen Host-Pfad bezeichnet, der dann dem Container-Speicherort auf der rechten Seite zugeordnet wird? Mir ist klar, dass Sie darüber sprechen, wie Docker das Kopieren von Dateien zwischen links und rechts verwalten kann und wie es geändert wird.
Charlie Arehart
@charliearehart Du hast recht. Ich werde diesen Fehler jetzt beheben.
Bernard