Я могу обмениваться файлами между контейнерами Docker, как мне поделиться одними и теми же файлами с хостом

У меня есть несколько контейнеров, работающих с Pi4, как определено в файле docker-compose.yml (выдержка ниже). Они собирают данные с аппаратного обеспечения, которое записывает данные в /home/hardware/data/ в контейнере «аппаратное обеспечение». Это успешно передано контейнеру «celery_worker» через именованный том «data».

Моя проблема в том, что мне также нужно, чтобы файлы были доступны на хосте (например, /tmp/hardware_data), потому что они должны быть прочитаны другим приложением на другом компьютере в моей домашней сети.

  • /tmp/hardware_data:/home/hardware/data/ не работает.

Я гуглил, читал документацию Docker и смотрел несколько видеороликов на YouTube, но не нашел решения.

celery_worker:
    image: celery_worker:latest
    container_name: celery_worker
    volumes:
      - data:/srv/project/hardware/hardware_data/

hardware:
    image: hardware:latest
    container_name: hardware
    volumes:
      - data:/home/hardware/data/

volumes:
  #to share hardware data
  data: {}

ХХХХХХХХХХХХХ Обновление

Совет Конрада по избавлению от именованных томов имел смысл, и мой (распакованный) файл docker-compose.yml теперь выглядит так:

celery_worker:
    image: celery_worker:latest
    container_name: celery_worker
    volumes:
      - /tmp/hardware_data:/srv/project/hardware/hardware_data/

hardware:
    image: hardware:latest
    container_name: hardware
    volumes:
      - /tmp/hardware_data:/home/hardware/data/

Во время разработки я запускаю Docker как root. Я «коснулся» «тестового файла» в Dockerfile аппаратного контейнера. Если я запускаю контейнеры с томами #, «тестовый файл» создается в /home/hardware/data/ в аппаратном контейнере со следующими разрешениями «-r w-r - -r- - root root .

Когда я запускаю docker-compose.yml с определенными томами, я получаю три пустых каталога (2 в контейнерах и 1 в хосте), т. е. «тестовый файл» аппаратного контейнера отсутствует ни в одном из каталогов. Если я «касаюсь» «нового тестового файла» в любом из каталогов, он используется всеми тремя с теми же разрешениями, что и исходный «тестовый файл»: «- r w- r - - r - - root root».

Исходя из этого, я не вижу, что это проблема с разрешениями


person SgtBilko    schedule 28.07.2020    source источник
comment
Я бы предположил, что это связано с тем, что у вас есть и том докера, и локальный том, привязанный к одному и тому же пути в контейнере. Не уверен на 100%, но мне кажется это наиболее вероятным   -  person SiHa    schedule 28.07.2020
comment
Извините, не могли бы вы сказать мне, в чем разница между mount /tmp/hardware_data onto /home/hardware/data/ и mount /home/hardware/data/ onto /tmp/hardware_data? На мой взгляд, они одинаковы.   -  person bigpangl    schedule 28.07.2020
comment
Спасибо вам обоим. Возможно, я просто путаю ситуацию. Именованный том работает нормально. Не обращайте внимания на то, как я пытался это решить, потому что это не работает. Как поделиться файлами, созданными в аппаратном контейнере докера в /home/hardware/data/, с моим хостом? Я изменил свой вопрос.   -  person SgtBilko    schedule 28.07.2020


Ответы (2)


Решение

Я получил некоторые подсказки отсюда: https://forums.docker.com/t/how-to-access-docker-volume-data-from-host-machine/88063 Ответ Meyay «Только с именованными томами существующие данные копируются из контейнера целевую папку в том».

Этот код работает. Обратите внимание: /tmp/data должен предварительно существовать на хосте с теми же разрешениями (и владельцем, я думаю), что и контейнер докеров.

celery_worker:
    image: celery_worker:latest
    container_name: celery_worker
    volumes:
      - data:/srv/project/hardware/hardware_data/

hardware:
    image: hardware:latest
    container_name: hardware
    volumes:
      - data:/home/hardware/data/

volumes:
  data:
    driver: local
    driver_opts:
      o: bind
      type: none
      device: /tmp/data
person SgtBilko    schedule 29.07.2020

Вам нужно избавиться от именованного тома и использовать папку на хост-компьютере, например:

celery_worker:
    image: celery_worker:latest
    container_name: celery_worker
    volumes:
      - /tmp/hardware_data:/srv/project/hardware/hardware_data/

hardware:
    image: hardware:latest
    container_name: hardware
    volumes:
      - /tmp/hardware_data:/home/hardware/data/

Редактировать:

Без каких-либо подробностей о приложении, работающем в аппаратной службе, единственная причина, по которой я могу придумать, почему оно не будет записывать данные в связанный каталог хоста, — это проблема с разрешениями.

Вот статья на эту тему.

person Konrad Botor    schedule 28.07.2020
comment
Как я понял, ваша установка заключалась в том, что они должны начинаться пустыми, а затем аппаратная служба заполняет их данными. - person Konrad Botor; 28.07.2020
comment
Извините, мне пришлось удалить свой предыдущий комментарий, так как он содержал некоторую конфиденциальную информацию. Вот он снова............. Большое спасибо. Это имеет смысл и звучит многообещающе, но при попытке… все три каталога пусты. Я думаю, что ваш ответ на правильном пути, но не проблема ли здесь в том, что я монтирую пустой каталог хоста /tmp/hardware_data в /home/hardware/data/ в контейнере, делая его пустым? - person SgtBilko; 28.07.2020
comment
Как я понял, ваша установка заключалась в том, что они должны начинаться пустыми, а затем аппаратная служба заполняет их данными. ........ Это правильно, Конрад, все три каталога начинаются пустыми, а оборудование заполняет каталог /home/hardware/data в аппаратном контейнере. Если я помещаю файл в каталог хоста, он появляется в контейнерах. Мне нужно, чтобы все происходило наоборот. Данные, помещенные в контейнер, должны быть доступны другому контейнеру и хосту. - person SgtBilko; 28.07.2020
comment
Итак, проблема с моим решением заключается в том, что аппаратная служба не заполняет каталог? Есть ли какие-то журналы? Возможно, права доступа к каталогу /tmp/hardware_data неверны? - person Konrad Botor; 28.07.2020
comment
Спасибо Конрад. 1) Служба оборудования заполняет каталог оборудования без определенных томов. 2) Он заполняет и разделяет данные (с другими контейнерами), используя именованный том, но 3) Как только я определяю том хоста: контейнер, все каталоги пусты. - person SgtBilko; 28.07.2020
comment
Я предоставил права доступа к каталогу хоста «ugo + rwx», без изменений. - person SgtBilko; 28.07.2020
comment
Если аппаратная служба не регистрирует причину, по которой она не записывает данные, я не знаю, что еще вы могли бы попробовать. - person Konrad Botor; 28.07.2020