Копирование файлов в контейнер с помощью Docker Compose

94

У меня есть место, Dockerfileгде я копирую существующий каталог (с содержимым) в контейнер, который отлично работает:

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:раздел из файла docker-compose. У вашего изображения уже есть данные. Раздел volume: просто перезаписывает данные. Также перейдите к текущему формату docker-compose (версия 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).
Бернард
Привет, я тоже пытаюсь сделать то же самое с docker-compose, но получаю сообщение об ошибке, не могли бы вы взглянуть на это ... stackoverflow.com/questions/45573831/…
utkarsh31
Привет, Бернард, в своем ответе вы говорите о том, «указывает ли правая часть именованный том, например myvolume или путь на хосте» . Разве вы не имели в виду «левую руку», так как здесь указывается путь к тому или хосту, который затем сопоставляется с местоположением контейнера на правой стороне? Я понимаю, что вы говорите о том, как Docker может управлять копированием файлов между левым и правым, и как это изменяется.
Чарли Арехарт
@charliearehart Вы правы. Я исправлю эту ошибку сейчас.
Бернар