У меня есть 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 ничего нет.

docker-compose.yml:

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

Screenshot of empty directory listing

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

Ответы (3)

Учитывая

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

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

В Dockerfile измените COPY на ADD. это способ копировать каталоги, а не файлы

Предисловие: Я понимаю, что этот вопрос довольно старый и что OP, возможно, нашел обходной путь, но поскольку я не вижу точного ответа, я счел целесообразным ответить на вопросы, поставленные OP как а также любые связанные с этим вопросы.

Во-первых, прояснение различия между именованными томами и привязками. Первый позволит вам видеть извне контейнера файлы, которые уже существуют в местоположении контейнера, а второй - нет. По сути, привязка монтирования работает очень похоже на монтирование тома в xNIX, что означает, что любые файлы, уже находящиеся в месте монтирования, будут замаскированы после монтирования устройства - воспринимайте это как наложение.

Затем, когда вы указываете . / Frontend /: / var /www/html/, вы указываете монтирование привязки, поэтому, когда вы смотрите в . / Frontend на на стороне хоста все файлы, которые вы ожидаете увидеть, исчезли. Если я правильно понимаю вашу конечную цель, вы хотите, чтобы файлы в / var /www/html/ внутри контейнера были доступны через то же самое место за пределами контейнера. Если да, то вы, вероятно, захотите использовать именованный том вместе с указанной пользователем точкой монтирования следующим образом:

volumes:
  Frontend:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/var/www/html'

php:
    build: php/
    volumes:
      - Frontend:/var/www/html/

Имейте в виду, что без driver_opts, перечисленных выше, именованный том все равно будет существовать, но расположение на стороне хоста будет в области Docker. Обычно это что-то вроде / var / lib / docker / volume или подобное. Точное местоположение можно найти в разделе Mounts команды docker inspect.


Пример

Вот аналогичная установка на моем лабораторном хосте PiHole.

docker-compose.yml (сокращенно)

volumes:
  etc-pihole:
  etc-dnsmasq.d:
  etc-unbound:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/home/dockeruser/ct5/etc-unbound'

services:
  pihole:
    container_name: asbuilt_ct5
    hostname: pb-asbuilt-5
    volumes:
         - './etc-pihole:/etc/pihole/'
         - './etc-dnsmasq.d:/etc/dnsmasq.d/'
         - 'etc-unbound:/etc/unbound/'

Вывод sudo docker inspect, Монтировать * только раздел 100006 * (сокращенно)

"Mounts": [
   {
      "Type": "bind",
      "Source": "/home/dockeruser/ct5/etc-dnsmasq.d",
      "Destination": "/etc/dnsmasq.d",
   },
   {
      "Type": "bind",
      "Source": "/home/dockeruser/ct5/etc-pihole",
      "Destination": "/etc/pihole",
   },
   {
      "Type": "volume",
      "Name": "ct5_etc-unbound",
      "Source": "/var/lib/docker/volumes/ct5_etc-unbound/_data",
      "Destination": "/etc/unbound",
      "Driver": "local",
   }
]

Список файлов-контейнеров: / etc / unbound

root@pb-asbuilt-5:/# ls /etc/unbound
unbound.conf  unbound.conf.d  unbound_control.key  unbound_control.pem  unbound_server.key  unbound_server.pem

Список файлов на стороне хоста: / home / dockeruser / ct5 / etc-unbound

[dockertest-srv1] > ls /home/dockeruser/ct5/etc-unbound
unbound.conf  unbound.conf.d  unbound_control.key  unbound_control.pem  unbound_server.key  unbound_server.pem

2022 WebDevInsider