У меня есть контейнер Docker, который я создал, просто установив Docker в Ubuntu и выполнив:
sudo docker run -i -t ubuntu /bin/bash
Я сразу начал устанавливать Java и некоторые другие инструменты, провел с ним некоторое время и остановил контейнер
exit
Затем я хотел добавить том и понял, что это не так просто, как я думал, что будет. Если я использую его, sudo docker -v /somedir run ...
то получаю новый новый контейнер, поэтому мне нужно установить Java и сделать то, что я уже сделал раньше, чтобы получить контейнер с подключенным томом.
Кажется, что вся документация по монтированию папки с хоста подразумевает, что монтирование тома - это то, что можно сделать при создании контейнера. Таким образом, единственная опция, которую я должен избежать, чтобы переконфигурировать новый контейнер с нуля, - это зафиксировать существующий контейнер в хранилище и использовать его в качестве основы для нового при монтировании тома.
Действительно ли это единственный способ добавить том в существующий контейнер?
docker
тега, составляют 34k + , что намного больше, чем у этих двух сайтов stackoverflow.com/questions/tagged/dockerОтветы:
Вы можете зафиксировать свой существующий контейнер (то есть создать новое изображение из изменений контейнера), а затем запустить его с вашими новыми монтируемыми устройствами.
Пример:
Если все в порядке, остановите свой старый контейнер и используйте этот новый.
Это оно :)
источник
newnameofcontainer
что это, вероятно, должно быть названоnew_image_name
- потому чтоdocker commit
создает новый образ в вашей системе. Затем в следующем, когда вы делаете a,docker run
вы фактически используете имя изображения , из которого вы хотите запустить новый контейнер. Вышеприведенное работает, но просто хотел уточнить для других, что указанная выше метка-заполнитель newnameofcontainer фактически является именем для нового изображения. Спасибо! отличный ответ. о, вы можете увидеть вновь созданный образ из первой команды фиксацииdocker image ls
docker run -v /srv/a:/tmp ubuntu:14.04
хорошо.У нас нет никакого способа добавить том в работающий контейнер, но для достижения этой цели вы можете использовать следующие команды:
Скопируйте файлы / папки между контейнером и локальной файловой системой: -
Для справки смотрите:
https://docs.docker.com/engine/reference/commandline/cp/
источник
Я успешно смонтировал
/home/<user-name>
папку своего хоста в/mnt
папку существующего (не запущенного) контейнера. Вы можете сделать это следующим образом:Откройте файл конфигурации, соответствующий остановленному контейнеру, который можно найти по адресу
/var/lib/docker/containers/99d...1fb/config.v2.json
(может бытьconfig.json
для более старых версий докера).Найти
MountPoints
раздел, который был пуст в моем случае:"MountPoints":{}
. Затем замените содержимое на что-то вроде этого (вы можете скопировать правильное содержимое из другого контейнера с правильными настройками):или такой же (отформатированный):
service docker restart
Это работает для меня с Ubuntu 18.04.1 и Docker 18.09.0
источник
systemctl stop docker.service
2. Отредактируйтеconfig.v2.json
:vim <(jq . /var/lib/docker/containers/<container-ID>/config.v2.json)
3. Сохраните обновления в файл::w config.v2.json
4. Выйдите из vim::q!
5. Обновите существующий файл:jq -c . config.v2.json > /var/lib/docker/containers/<container-ID>/config.v2.json
6. Запустите механизм докера:systemctl start docker.service
7. Запустите контейнер при необходимости. :docker start <container-name/ID>
8. Наслаждайтесь :-)service docker restart
. Я попыталсяdocker restart <container>
тогда, новый конфиг не поднят, и это перезаписывается старым конфигом.jq
поможет довольно распечатать JSON, чтобы он мог редактироваться человеком:cat config.v2.json | jq . > config.json
У Жерома Петаццони есть довольно интересное сообщение в блоге о том, как присоединить том к контейнеру во время его работы . Это не то, что встроено в Docker из коробки, но возможно сделать.
Как он также указывает
YMMV
источник
К сожалению, опция переключения для монтирования тома есть только в
run
команде.docker run --help
-v, --volume list Bind mount a volume (default [])
Есть способ обойти это, хотя вам не придется переустанавливать приложения, которые вы уже настроили в своем контейнере.
docker container export -o ./myimage.docker mycontainer
docker import ./myimage.docker myimage
docker run -i -t -v /somedir --name mycontainer myimage /bin/bash
источник
docker container
недопустимая команда в 1.11.2 (последняя версия, которая поддерживается Synology на момент написания статьи). Я не могу найти никаких документов, говорящих, когда это было добавлено, хотя. В этом случае первая командаdocker export -o ./myimage.docker mycontainer
.Замечание по использованию контейнеров Docker Windows после того, как мне пришлось долго искать эту проблему!
Condiditions:
Проблема:
Решение как частично различаемое здесь:
docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y microsoft/mssql-server-windows-developer
docker exec -it <CONTAINERID> cmd.exe
mkdir DirForMount
docker container stop <CONTAINERID>
docker commit <CONTAINERID> <NEWIMAGENAME>
docker container rm <CONTAINERID>
docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y -v C:\DirToMount:C:\DirForMount <NEWIMAGENAME>
После этого я решил эту проблему на контейнерах Docker Windows.
источник
Лучший способ - скопировать все файлы и папки в каталог в вашей локальной файловой системе:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
SRC_PATH
находится на контейнереDEST_PATH
на локальном хостеЗатем
docker-compose down
присоедините том к тому жеDEST_PATH
и запустите контейнеры Docker, используяdocker-compose up -d
Добавьте объем, следуя в
docker-compose.yml
источник