как привязать именованный том Docker к хосту - PullRequest
0 голосов
/ 28 июня 2019

Я новичок в Docker, в docker-compose.yml v.3.7 у меня есть общий том (называемый: apdata), который используется приложением и веб-сервисом, как показано ниже:

version: "3.7"

services:

  app:
    container_name: application
    build:
      context: ./
      dockerfile: app.dockerfile
    working_dir: /var/log
    volumes:
      - apdata:/var/log
#      - type: volume
#        source: apdata
#        target: /var/log
#        volume:
#          nocopy: true
    environment:
      - "DB_PORT=3306"
      - "DB_HOST=database"

  web:
    container_name: website
    build:
      context: ./
      dockerfile: web.dockerfile
    working_dir: /var/www
    volumes:
      - apdata:/var/www
#      - type: volume
#        source: apdata
#        target: /var/www
#        volume:
#          nocopy: true
#      - type: bind
#        source: ../www/
#        target: /var/www
    ports:
      - 8888:80
    depends_on:
      - app

volumes:
  apdata:
    driver: local
  dbdata:

вышеconfig выглядит работающим (без ошибок), но как мне синхронизировать данные с моим локальным компьютером / хостом?

вопрос: есть ли способ или как сопоставить / привязать данные тома к хосту или локальному диску?например:

в apdata: веб-служба: /var/www сопоставление с локальным файлом: c:\test в apdata: служба приложения: /var/log сопоставление с локальным файлом: ..\log

чтобы я мог прочитать журнал на моем хосте (на моем локальном компьютере) - Windows и я могу развернуть или отредактировать свой код на своем локальном компьютере и синхронизировать его с контейнером

Возможно ли это?

edit

это не дубликат, позвольте мне объяснить подробнее: у меня есть 1 том тома, этот том используется двумя службами: приложением и веб-сайтом.и отображается следующим образом: application service --> /var/log и website service --> /var/www

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

1 Ответ

0 голосов
/ 28 июня 2019

Это действительно возможно, если воспользоваться преимуществами настроек driver и driver_opts для такой конфигурации тома в docker-compose 3.2 +

На основе вашего примера вВ файловой системе Linux это может быть что-то вроде:

volumes:
  apdata:
    driver: local
    driver_opts:
      type: none
      device: /home/$USER/data/app
      o: bind

  dbdata:
    driver: local
    driver_opts:
      type: none
      device: /home/$USER/data/web
      o: bind

Конечно, вы должны убедиться, что целевые файлы уже существуют

mkdir /home/$USER/data/{app,web}

Как приятный побочный эффект этого решения,вы сможете по-прежнему составлять списки своих томов обычным способом:

docker volume ls

, и в то же время вы сможете получить прямой доступ ко всему общему контенту из контейнера впапки, которые вы привязываете к таким томам таким образом.


Обновление

Более простой способ сделать это (например, если вы просто хотите это для целей тестирования)) состоит в том, чтобы просто избавиться от раздела томов (в нижней части файла docker-compose) и вместо этого связать свои тома непосредственно в разделе томов каждого определения службы:

version: "3.7"

services:
  app:
    container_name: application
    build:
      context: ./
      dockerfile: app.dockerfile
    working_dir: /var/www
    volumes:
      - /home/$USER/mysite/logs:/var/log
  web:
    container_name: website
    build:
      context: ./
      dockerfile: web.dockerfile
    working_dir: /var/www
    volumes:
      - /home/$USER/mysite/test:/var/www
    ports:
      - 8888:80
    depends_on:
      - app

Для систем Windows простозаменить полный рДля того, чтобы каталог хоста соответствовал вашей фактической структуре папок, например:

...
    volumes:
      - C:\mysite\logs:/var/log

Кстати: вам больше не нужно связывать контейнеры в вашем docker-compose, поскольку теперь они автоматически связываются с помощью Docker,поэтому все, что работает в вашем web контейнере / службе, всегда сможет найти вашу app службу по имени (как если бы они на самом деле были связаны )

Итак .. выможете удалить эту часть:

...
   links:
     - app

Добавление дополнительного примера здесь (чтобы соответствовать вашему последнему обновлению вопроса):

version: "3.7"

services:
  app:
    container_name: application
    build:
      context: ./
      dockerfile: app.dockerfile
    working_dir: /var/www
    volumes:
      - C:\log:/var/log
  web:
    container_name: website
    build:
      context: ./
      dockerfile: web.dockerfile
    working_dir: /var/www
    volumes:
      - C:\test:/var/www
    ports:
      - 8888:80
    depends_on:
      - app
#-- end of file

Когда вы запустите еготаким образом, вы сможете перемещаться на вашем хост-компьютере по следующим путям: C:\log & C:\temp и все, что вы там скопируете, ваш контейнер будет автоматически иметь к нему доступ (но по соответствующим им отображенным путям).

Например, если вы скопируете обновленную версию своего веб-сайта (или даже если вы отредактируете ее непосредственно в этой папке C:\test), ваш контейнер автоматически будет иметь такое же обновленное содержимое.

И каждый раз, когда ваше приложение создает новую запись в журнале (или файл), вы сможете получить к ней доступ непосредственно в этой папке C:\log, которая действительно является той же самой папкой /var/log в области действия вашего приложения (внутриего собственный контейнер)


Теперь, если вы хотите, чтобы оба содержимого (/var/log приложения и /var/www в Интернете) совместно использовали один и тот же каталог (и, таким образом, одни и те же файлы и папки внутри такихпути), затем просто используйте те же каталоги в левой части привязок тома

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...