2016-08-27 9 views
18

У меня есть 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 

Screenshot of directory listing with docker exec

Но когда я использую файл docker-compose.yml, есть только каталог aw3somevideo и внутри aw3somevideo ничего.

докер-compose.yml:

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

Screenshot of empty directory listing

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

+1

Кого бы оставили -1, вы должны добавить комментарий по причине. Это просто базовый тактический этикет. – Alkaline

+2

Извлеките раздел 'томов:' из файла для компоновки docker. У вашего изображения уже есть данные. Тома: раздел просто перезаписывает данные. Также перейдите к текущему формату компоновки докеров (версия 2). – Alkaline

+0

@Alkaline thx, что действительно было проблемой. Но почему тома не копировала весь каталог? – TheDoctor

ответ

15

Обновлено апреля 2017

поведение изменилось, так как я написал оригинальный ответ. Теперь согласуется, указывает ли правая сторона именованного тома как myvolume или путь на хосте, например /var/lib/myapp. Например

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

если /dir/on/host не существует, он будет создан на хосте и пустое содержание установлен в контейнере при /var/www/html. Все, что было в /var/www/html раньше, недоступно.

---- старый ответ -----------

volumes: раздел в вашем Докер-композе переписывает все, что находится в каталоге /var/www/html.

Есть два сетевых ситуации:

  1. Объем существует

    В этом случае содержание объема затмевает все, что находится в каталоге Dst.

    Например:

    volumes: 
        - /dir/on/host:/var/www/html 
    
  2. Объем не существует

    Если myvolume не существует (именованный объем, например), содержание/вар/WWW/HTML будут скопированы к объему в первый раз вокруг

    volumes: 
        - myvolume:/var/www/html 
    

в случае 2, если вы пытаетесь установить один и тот же объем снова на каком-то контейнере, это будет следовать случаю 1.

volumes: 
     - myvolume:/var/www/html 

В этом случае (при условии, myvolume уже была создана), содержание/вар/WW/html будут перезаписаны (слежка) на то, что в myvolume.

Официальный документ переходит в более подробно https://docs.docker.com/compose/compose-file/#/volumes-volume-driver

+0

Возможно ли, что с недавними версиями докеров содержимое 'var/www/html /' больше не копируется в '/ dir/on/host', даже если оно не существует? Есть ли способ принудительно скопировать данные из контейнера докеров на хост при первом запуске контейнера? – Tarator

+0

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

+0

Привет, Я тоже пытаюсь сделать то же самое с составлением докеров, но получаю сообщение об ошибке. Не могли бы вы взглянуть на него ... https: //stackoverflow.com/questions/45573831/docker-compose-not- возможность копируемого-HAProxy-CFG .... Спасибо – utkarsh31

 Смежные вопросы

  • Нет связанных вопросов^_^