Mount folder linux docker

How to mount a directory inside a docker container on Linux host [duplicate]

I would like to mount a directory from a docker container to the local filesystem. the directory is a website root and I need to be able to edit it my local machine using any editor. I know I can run docker run -v local_path:container_path but doing that it is only creating an empty directory inside the container. How can one mount a directory inside a docker container on linux host?

thank you, how would you suggest use volumes to provide developer a ready to use lamp stack environment so that they can use their own computer with their favourites editors and tools?

Consider doing it the other way around. Mount your source directory inside your container. Use your editor, build, execute from the mounted directory inside your container. Other way would be to mount the directory on host and copy from container the source code to the mounted directory so it is accessible from host for your editor.

I don’t understand people which dedicates to spread negative points to questions and answers. This question is not only perfectly valid it is a missing feature in docker. You should be able to mount a named volume in your host. It is already in the filesystem, but if you write there the changed won’t be reflected in the container

2 Answers 2

It is a bit weird but you can use named volumes for that. Despite host mounted volumes, named ones won’t be empied. And you can access the dir. See the example:

docker volume create --name data docker run -rm=true -v data:/etc ubuntu:trusty docker volume inspect data [ < "Name": "data", "Driver": "local", "Mountpoint": "/var/lib/docker/volumes/data/_data", "Labels": <>, "Scope": "local" > ] 
mkdir ~/data sudo -s cp -r /var/lib/docker/volumes/data/_data/* ~/data echo "Hello World">~/data/hello.txt docker run --rm=true -v ~/data:/etc ubuntu:trusty cat /etc/fstab #The content is preserved docker run --rm=true -v ~/data:/etc ubuntu:trusty cat /etc/hello.txt #And your changes too 

It is not exactly you were asking for but depends on your needs it works

Читайте также:  Linux with media center

If your goal is to provide a ready to go LAMP, you should use the VOLUMES declaration inside the Dockerfile. VOLUME volume_path_in_container The problem is that docker will not mount the file cause they were already present in the path you are creating the volume on. You can go as @Grif-fin said in his comment or modify the entry point of the container so he copy the file you want to expose to the volume at the run time.

You have to insert your datas using the build COPY or ADD command in Dockerfile so the base files will be present in the container.

Then create an entrypoint that will copy file from the COPY path to the volume path.

Then run the container using the -v tag and like -v local_path:volume_path_in_container . Like this, you should have the files inside the container mounted on the local. (At least, it was what I add).

It will avoid to have to build every time and you can provide it from a definitive image.

To be nicer, it would be nice to add an user support so you are owner of the mounted files (if you are not root).

Hope it was useful to you.

Источник

Как монтировать папки в Docker

Контейнеры облегчают жизнь разработчика и повышают эффективность его работы. При этом одно из самых популярных решений контейнеризации — Docker.

Контейнеры Docker по своей природе неизменяемы. Это означает, что при перезапуске контейнера все данные, сохраненные в нем, сотрутся. Но сохранить эти данные можно. Для этого Docker предоставляет возможность подключения к контейнеру локальных директорий.

Читайте также:  Linux автозагрузка скрипта python

В этом руководстве мы рассмотрим два способа подключения и использования локальных папок в Docker. Знание обоих путей позволит вам более эффективно использовать контейнеры в разных ситуациях.

Как подключить локальную директорию при помощи docker run -v

Команда docker run сперва создает доступный для записи слой контейнера поверх указанного образа, а затем запускает его с использованием указанной команды (Источник — docker.com).

Параметр -v или —volume (англ. volume — «том») позволяет монтировать локальные директории и файлы к контейнеру. Например, вы можете запустить базу данных MySQL и примонтировать директорию для хранения в ней настоящих данных.

# запустить контейнер mysql в фоне $ docker run --name mysql-db -v $(pwd)/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:8.0.28-debian # показать содержимое директории datadir $ ls -la datadir total 383848 -rw-r----- 1 sebarthel staff 196608 Mar 26 22:47 #ib_16384_0.dblwr -rw-r----- 1 sebarthel staff 8585216 Mar 26 22:47 #ib_16384_1.dblwr drwxr-x--- 12 sebarthel staff 384 Mar 26 22:47 #innodb_temp drwxr-xr-x@ 27 sebarthel staff 864 Mar 26 22:47 . drwxr-xr-x 3 sebarthel staff 96 Mar 26 22:47 .. -rw-r----- 1 sebarthel staff 56 Mar 26 22:47 auto.cnf -rw-r----- 1 sebarthel staff 913 Mar 26 22:47 binlog.000001 (more directories) # остановить контейнер mysql docker rm -f mysql-db

Подключение директории означает двустороннюю синхронизацию. Любой файл, измененный на хосте, изменится и в контейнере, а любой файл, измененный в контейнере, изменится и на хосте. Таким образом, если вы остановите и заново запустите базу данных, вы сможете примонтировать ту же директорию, и вам будут доступны ваши настройки и сохраненные данные.

Преимущество этого метода в том, что он прост и легок в использовании. Монтируйте локальные директории при помощи docker run -v тогда, когда планируете просматривать и изменять файлы на хосте. Например, это подходит для файлов конфигурации и логов.

Читайте также:  Переключение мониторов горячие клавиши linux

Как сохранять изменения при помощи томов Docker

Для сохранения изменений можно монтировать не локальную директорию, а том Docker.

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

Давайте создадим том Docker и подключим его для сохранения данных MySQL.

# создать том (volume) docker volume create mysql-data # запустить контейнер mysql в фоне $ docker run --name mysql-db -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest # остановить контейнер mysql docker rm -f mysql-db # удалить том docker volume remove mysql-data

Перед удалением тома Docker вы можете открыть ваш Docker GUI и просмотреть том, кликнув на вкладку data.

Вы видите эти файлы, но они изолированы в томе Docker.

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

Итоги

Контейнеры Docker становятся куда более полезными, если вы умеете сохранять ваши данные и не теряете их при остановке контейнера.

Вы можете привязывать локальные директории и тома к контейнеру при помощи параметра -v для команды docker run . При этом вам придется указать абсолютный путь к локальной папке или имя тома и примонтировать их к директории внутри контейнера -v : .

От редакции Techrocks. Если вам интересна эта тема, можем порекомендовать хорошее видео. В нем разбирается подключение директории с помощью флага -v (как в этой статье), а также с помощью флага —mount .

Источник

Оцените статью
Adblock
detector