9

Как смонтировать директорию хоста в контейнер Docker

11

Описание проблемы:

Я пытаюсь примонтировать директорию хоста в контейнер Docker таким образом, чтобы все обновления, сделанные на хосте, отражались в Docker-контейнере.

Вот что я сделал:

Dockerfile:

FROM ubuntu:trusty
RUN apt-get update
RUN apt-get -y install git curl vim
CMD ["/bin/bash"]
WORKDIR /test_container
VOLUME ["/test_container"]

Структура проекта:

.
├── Dockerfile
└── main_folder
    ├── tfile1.txt
    ├── tfile2.txt
    ├── tfile3.txt
    └── tfile4.txt
1 directory, 5 files

Текущая директория: /Users/kishore/tdock

Сборка Docker-образа:

$ docker build --tag=k3_s3:latest .

Сборка проходит успешно.

Запуск контейнера с монтированием:

$ docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest

Контейнер запущен.

Проверка содержимого контейнера:

$ docker run -i -t k3_s3:latest /bin/bash

Внутри контейнера:

root@0f17e2313a46:/test_container# ls -al
total 8
drwx------  2 root root 4096 Apr 29 05:15 .
drwxr-xr-x 66 root root 4096 Apr 29 05:15 ..

Как видно, папка /test_container внутри контейнера пуста.

Версия Docker:

$ docker -v
Docker version 0.9.1, build 867b2a9

Вопросы и проблемы:

  1. Как правильно связать main_folder с папкой test_container, которая находится внутри контейнера?
  2. Как сделать эту привязку автоматически, без необходимости каждый раз использовать команду run -d -v?
  3. Что произойдет, если boot2docker упадет? Где хранятся файлы Docker (кроме самого Dockerfile)?

5 ответ(ов)

7

Есть несколько способов сделать это. Самый простой способ — использовать команду ADD в Dockerfile следующим образом:

ADD . /path/inside/docker/container

Однако, стоит отметить, что любые изменения, внесенные в этот каталог на хосте после сборки Dockerfile, не будут отображаться в контейнере. Это связано с тем, что при сборке контейнера Docker сжимает каталог в файл .tar и загружает этот контекст в контейнер навсегда.

Второй способ, который вы пытались использовать, — это монтирование тома. Поскольку требуется максимальная портативность, вы не можете сопоставить каталог хоста с каталогом контейнера в Dockerfile, поскольку каталог на хосте может меняться в зависимости от машины, на которой вы работаете. Чтобы сопоставить каталог хоста с каталогом контейнера, необходимо использовать флаг -v при выполнении команды docker run, например:

# Запускаем контейнер, используя образ `alpine`, монтируем
# директорию `/tmp` с вашего хоста в директорию
# `/container/directory` в вашем контейнере и выполняем команду `ls` 
# для отображения содержимого этой директории.
docker run \
    -v /tmp:/container/directory \
    alpine \
    ls /container/directory
1

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

docker run -t -i -v <host_dir>:<container_dir> ubuntu /bin/bash

где host_dir — это директория на хосте, которую вы хотите смонтировать. Вам не нужно беспокоиться о директории в контейнере: если её не существует, Docker создаст её автоматически.

Если вы внесете изменения в host_dir с хостовой машины (с правами root), они будут видны в контейнере, и наоборот.

0

Ответ на ваш вопрос может выглядеть так:

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

Вам понадобится выполнить 2 последовательных монтирования:

  1. Первое для монтирования директории с вашего хоста в вашу систему:

    sudo mount -t vboxsf hostfolder /boot2dockerfolder
    
  2. Второе для монтирования директории boot2docker в ваш контейнер следующим образом:

    docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename
    

После выполнения этих команд, если вы выполните ls внутри containerfolder, вы увидите содержимое вашей директории hostfolder.

0

Чтобы смонтировать папку из текущего каталога, вы можете использовать следующую команду:

docker run -d --name some-container -v ${PWD}/folder:/var/folder ubuntu

Здесь ${PWD} обозначает текущий рабочий каталог, и folder — это папка, которую вы хотите смонтировать в контейнере по пути /var/folder. Убедитесь, что папка folder существует в вашем текущем каталоге перед запуском команды.

0

Вы можете использовать следующую команду для запуска вашего приложения SailsJS/NodeJS внутри контейнера Docker и монтирования его в каталог /app:

cd my_source_code_folder
docker run -it -p 1337:1337 -v $(pwd):/app my_docker/image_with_nodejs_etc

Эта команда делает следующее:

  • -it: позволяет вам взаимодействовать с контейнером через терминал.
  • -p 1337:1337: проксирует порт 1337 вашего хоста на порт 1337 контейнера, чтобы вы могли получить доступ к приложению через браузер.
  • -v $(pwd):/app: монтирует текущую директорию (где находятся ваши исходные коды) в контейнер под каталогом /app.

Таким образом, вы сможете тестировать и разрабатывать ваше приложение в изолированной среде, не загрязняя вашу физическую машину. Убедитесь, что у вас установлен Docker и правильно настроен образ my_docker/image_with_nodejs_etc.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь