Kopiowanie plików do kontenera za pomocą Docker Compose

101

Mam miejsce, w Dockerfilektórym kopiuję istniejący katalog (z zawartością) do kontenera, który działa dobrze:

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 

Zrzut ekranu z listą katalogów za pomocą docker exec

Ale kiedy używam docker-compose.ymlpliku, jest tylko katalog, aw3somevideoa wewnątrz aw3somevideonie ma nic.

docker-compose.yml :

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

Zrzut ekranu przedstawiający listę pustych katalogów

Może nie rozumiem funkcji volumesi jeśli tak jest, powiedz mi, jak skopiować moje istniejące pliki do kontenera za pośrednictwem docker-compose.ymlpliku.

Doktor
źródło
5
Usuń volumes:sekcję z pliku Docker-Compose. Twój obraz ma już dane. Sekcja Volume: po prostu nadpisuje dane. Przejdź również do bieżącego formatu docker-compose (wersja 2).
Bernard,
@Alkaline thx, to naprawdę był problem. Ale dlaczego woluminy nie skopiowały całego katalogu?
TheDoctor
Odpowiem jako odpowiedź, abyś zamknął ten problem.
Bernard,

Odpowiedzi:

89

Dany

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

jeśli /dir/on/hostnie istnieje, jest tworzony na hoście, a pusta zawartość jest montowana w kontenerze pod adresem /var/www/html. Jakakolwiek zawartość, którą miałeś wcześniej w /var/www/htmlkontenerze, jest niedostępna, dopóki nie odmontujesz woluminu; nowy wierzchowiec ukrywa starą zawartość.

Bernarda
źródło
Czy to możliwe, że w ostatnich wersjach dockerowych zawartość var/www/html/nie jest już kopiowana, /dir/on/hostnawet jeśli nie istnieje? Czy istnieje sposób wymuszenia kopiowania danych z kontenera docker-container do hosta podczas pierwszego uruchomienia kontenera?
Tarator
1
@Tarator tak, rzeczywiście, prawa strona nie jest już kopiowana do hosta. Zaktualizuję odpowiedź. Jeśli chodzi o sposób kopiowania przy uruchamianiu kontenera, możesz zastąpić polecenie uruchamiania czymś takim docker run -v /dir/on/host:/hostdir php sh -c "cp -rp /var/www/html/* /hostdir && exec myapp". Nie zapomnij użyć execdo wywołania ostatniej komendy, tak aby przypisano jej PID1. To zapewni, że myapp otrzyma sygnały zakończenia (na przykład Ctrl-C).
Bernard
Cześć, próbuję też zrobić to samo z docker-compose, ale pojawia się błąd, czy możesz
rzucić
Hej, Bernard, w swojej odpowiedzi masz na myśli „ czy prawa strona określa nazwany wolumin, taki jak myvolume, czy ścieżkę na hoście” . Czy nie miałeś na myśli „lewej ręki”, ponieważ tam wyznacza się wolumin lub ścieżkę hosta, która jest następnie mapowana na lokalizację kontenera po prawej stronie? Zdaję sobie sprawę, że mówisz o tym, jak Docker może zarządzać kopiowaniem plików między lewą a prawą stroną i jak to się zmieniło.
charlie arehart
@charliearehart Masz rację. Naprawię ten błąd teraz.
Bernard