Docker & Angular 2: связанный каталог остается пустым

Я должен работать над приложением стека MEAN, полностью докеризованным. Итак, у нас есть три изображения:

  • Один для базы данных монго
  • Один для бэкенда (nodejs)
  • И один для интерфейса (angular 2)

Поскольку я хочу работать на фронте во время работы контейнера, я пытаюсь привязать папку к папке src в контейнере.

Для этого я запускаю контейнер с помощью следующей команды:

docker run --name frontend -d -p 5555:5555 --link backend -v /home/frontend:/code/src/ infra-frontend:latest

Docker создает каталог, но он остается пустым, несмотря на то, что он не пуст в контейнере (я проверил с помощью команды docker exec bash).

Итак, поскольку я впервые имею дело с Docker, я немного растерялся и хотел бы получить помощь.


person Cédric Rémond    schedule 17.02.2017    source источник
comment
Докер работает непосредственно на вашем хосте или внутри чего-то вроде VirtualBox?   -  person Gerrat    schedule 18.02.2017
comment
Непосредственно на моем хосте, почему?   -  person Cédric Rémond    schedule 18.02.2017
comment
когда вы делитесь томом в контейнере, он заменяет папку в контейнере папкой на хосте, поэтому, если папка не является чем-то, что ваш контейнер заполнит, она останется пустой. Этот вопрос может дополнить его: уже существующие в нем данные"> stackoverflow.com/questions/36152081/   -  person Lucas dos Santos Abreu    schedule 18.02.2017
comment
Возможный дубликат Создать том Docker с уже существующими данными   -  person Lucas dos Santos Abreu    schedule 18.02.2017
comment
Вроде та же проблема, но я не очень понимаю ответ.   -  person Cédric Rémond    schedule 18.02.2017


Ответы (2)


ПРИМЕЧАНИЕ. На этот вопрос отвечает предыдущий вопрос Создать том Docker с уже существующими данными, но поскольку пользователь у меня возникли некоторые трудности с пониманием того, что это может означать, я добавил подробности ниже.

Когда докер монтирует тома, он следует правилам mount для файловой системы unix. Это означает, что эти файлы не будут отображаться при монтировании. Вы можете узнать больше об этом в Github Issues for docker здесь.

Как я вижу, у вас есть несколько вариантов:

  1. Прочитайте о «контейнерах только для данных» и используйте это (вероятно, лучше посмотреть на Docker Volume)
  2. Используйте ENTRYPOINT или CMD, чтобы указать сценарий, который будет загружать исходный код в /code/src/ при запуске контейнера.
  3. Держите источник всегда на хосте и просто укажите на него из образа докера (например, /home/frontend ‹- есть данные, пустой каталог -> /code/src/)
  4. Загрузите исходный код в /code/src, но откройте том /mycode/. Затем синхронизируйте изменения между /code/src/ и /mycode, используя что-то вроде rsync.

Каждый из этих вариантов имеет разный уровень сложности. Самый простой из них, вероятно, № 2 или № 3. Я считаю, что концепция контейнеров только для данных заменена на docker volume, так как Docker 1.10 что ли?

person jrbeverly    schedule 18.02.2017

Предыдущее объяснение от @jrbeverly, вероятно, верно, но не так просто для понимания и не связано с документацией по докеру.

Вот простое объяснение из документации Docker:

«Тома инициализируются при создании контейнера. Если базовый образ контейнера содержит данные в указанной точке монтирования, эти существующие данные копируются в новый том при инициализации тома. (Обратите внимание, что это не применяется при монтировании хоста каталог.)"

источник: https://docs.docker.com/engine/tutorials/dockervolumes/

Таким образом, вы можете создать именованный том (-v frontend:/code/src), если вам нужно, чтобы содержимое /code/src копировалось в том при инициализации тома. Ваш том будет не в /home/frontend, а в /var/lib/docker/volumes/frontend/_data.

person Tristan    schedule 18.02.2017