Как смонтировать директорию хоста в контейнер Docker
Описание проблемы:
Я пытаюсь примонтировать директорию хоста в контейнер 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
Вопросы и проблемы:
- Как правильно связать
main_folder
с папкойtest_container
, которая находится внутри контейнера? - Как сделать эту привязку автоматически, без необходимости каждый раз использовать команду
run -d -v
? - Что произойдет, если
boot2docker
упадет? Где хранятся файлы Docker (кроме самого Dockerfile)?
5 ответ(ов)
Есть несколько способов сделать это. Самый простой способ — использовать команду 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
Вы можете использовать опцию -v
из командной строки, так как эта функция недоступна через Dockerfile.
docker run -t -i -v <host_dir>:<container_dir> ubuntu /bin/bash
где host_dir
— это директория на хосте, которую вы хотите смонтировать. Вам не нужно беспокоиться о директории в контейнере: если её не существует, Docker создаст её автоматически.
Если вы внесете изменения в host_dir
с хостовой машины (с правами root), они будут видны в контейнере, и наоборот.
Ответ на ваш вопрос может выглядеть так:
Если вы используете два экземпляра boot2docker, вероятно, причина, по которой вы не видите содержимого, заключается в том, что вы монтируете директорию из boot2docker, а не с вашего хоста.
Вам понадобится выполнить 2 последовательных монтирования:
Первое для монтирования директории с вашего хоста в вашу систему:
sudo mount -t vboxsf hostfolder /boot2dockerfolder
Второе для монтирования директории
boot2docker
в ваш контейнер следующим образом:docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename
После выполнения этих команд, если вы выполните ls
внутри containerfolder
, вы увидите содержимое вашей директории hostfolder
.
Чтобы смонтировать папку из текущего каталога, вы можете использовать следующую команду:
docker run -d --name some-container -v ${PWD}/folder:/var/folder ubuntu
Здесь ${PWD}
обозначает текущий рабочий каталог, и folder
— это папка, которую вы хотите смонтировать в контейнере по пути /var/folder
. Убедитесь, что папка folder
существует в вашем текущем каталоге перед запуском команды.
Вы можете использовать следующую команду для запуска вашего приложения 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
.
Извлечение имени файла и расширения в Bash
Как изменить цвет вывода echo в Linux
Как сделать паузу в shell-скрипте на одну секунду перед продолжением?
Как работает "cat << EOF" в bash?
Передача параметров в функцию Bash