Копіювання файлів у контейнер за допомогою Docker Compose


94

У мене є 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 

Знімок екрана списку каталогів з docker exec

Але коли я використовую docker-compose.ymlфайл, є лише каталог, aw3somevideoа всередині aw3somevideoнічого.

docker-compose.yml :

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

Знімок екрана порожнього списку каталогів

Можливо, я не розумію функції, volumesі якщо це так, підкажіть, як скопіювати мої наявні файли до контейнера через docker-compose.ymlфайл.


4
Видаліть свій volumes:розділ із файлу для створення докера. Дані на вашому зображенні вже є. Розділ том:: просто перезаписує дані. Також перейдіть до поточного формату складання докера (версія 2).
Бернард

@Alkaline thx, що насправді було проблемою. Але чому томи не скопіювали весь каталог?
TheDoctor

Я відповім як відповідь, щоб ви закрили це питання.
Бернард

Відповіді:


80

Дано

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

якщо /dir/on/hostне існує, він створюється на хості, а порожній вміст монтується в контейнер за адресою /var/www/html. Будь-який вміст, який ви мали раніше в /var/www/htmlконтейнері, недоступний, доки ви не демонтуєте обсяг; нове кріплення приховує старий вміст.


Чи можливо, що в останніх версіях докера вміст var/www/html/більше не копіюється, /dir/on/hostнавіть коли він не існує? Чи є спосіб примусово скопіювати дані з докер-контейнера на хост при першому запуску контейнера?
Таратор

1
@Tarator так, правда, праворуч більше не копіюється на хост. Я оновлю відповідь. Що стосується способу копіювання під час запуску контейнера, ви можете замінити команду запуску приблизно таким чином docker run -v /dir/on/host:/hostdir php sh -c "cp -rp /var/www/html/* /hostdir && exec myapp". Не забудьте використати, execщоб викликати остаточну команду, щоб їй було призначено PID1. Це забезпечить отримання myapp сигналів завершення (наприклад, Ctrl-C).
Бернард,

Привіт, я також намагаюся те ж саме з Докер-композит , але отримую повідомлення про помилку, Ви можете , будь ласка, подивіться на нього ... stackoverflow.com/questions/45573831 / ...
utkarsh31

Гей, Бернарде, у своїй відповіді ви посилаєтесь на те, " чи правий бік вказує іменований том, як мій обсяг, або шлях на хості" . Ви не мали на увазі там "ліву руку", оскільки там позначається або том, або шлях хосту, який потім відображається у розташуванні контейнера на rhs? Я усвідомлюю, що ви говорите про те, як Docker може керувати копіюванням файлів між лівим і правим, і як це змінюється.
Чарлі Ареарт,

@charliearehart Ви маєте рацію. Зараз виправлю цю помилку.
Бернард
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.