Монтирование нескольких томов в Docker-контейнере?

153

Я знаю, что могу смонтировать каталог в моем хосте на моем контейнере, используя что-то вроде

docker run -t -i -v '/on/my/host:/on/the/container' ubuntu /bin/bash

Есть ли способ создать более одной пары хост-контейнер? например, список через запятую, или передать в массиве?

Seldo
источник
как я понимаю текущее состояние терминов в документах, вы не можете смонтировать том (название вопроса), у вас наверняка может быть много привязок к папкам хоста (именно об этом и
Алексей

Ответы:

260

Передайте несколько -vаргументов.

Например:

docker -v /on/my/host/1:/on/the/container/1 \
       -v /on/my/host/2:/on/the/container/2 \
       ...
Чарльз Даффи
источник
2
Итак, я делаю это точно так же, но когда я пытаюсь вызвать второй, он говорит, что он не найден.
momal
docker запустите -v / home / usr / workspace / proj / WebContent / file / username: / mycode -v / home / usr / workspace / proj / WebContent / file: / tst gcc: 4.9 sh -c 'cd mycode; gcc -o myapp ./mycode.c; CD TST; ./myapp <./test.txt 'Это моя команда, я пытаюсь скомпилировать mycode.c, находящийся в первом томе, но дать этому же файлу стандартный ввод с другого тома. Как мне это сделать?
momal
1
@YehCheez, я бы (настоятельно) предложил открыть это как отдельный вопрос и попытаться создать репродуктор. (Если бы вы могли воспроизвести ошибку с образом Docker в публичном реестре и создать все локальные зависимости в сценарии, приведенном в вопросе, это было бы идеально).
Чарльз Даффи
Всегда ли нужны абсолютные пути?
xatzistnr
3
Пункт назначения всегда должен быть абсолютным. Источником должен быть либо абсолютный путь, либо идентификатор для именованного тома - см. Docs.docker.com/engine/admin/volumes/volumes для документации по последнему.
Чарльз Даффи
19

Docker теперь рекомендует перейти к использованию --mount.

Многократное монтирование тома также подробно объясняется в текущей документации Docker.

От: https://docs.docker.com/storage/bind-mounts/

$ docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  --mount type=bind,source="$(pwd)"/target,target=/app2,readonly,bind-propagation=rslave \
  nginx:latest

Оригинальный старый ответ должен все еще работать; просто пытаюсь сохранить ответ в соответствии с текущим наиболее известным методом.

MadJangi
источник
Стоит добавить, что единственная причина, по которой Docker рекомендует мигрировать, заключается в том, что их исследования показывают, что --mount проще в использовании и имеет больше возможностей. Использование -v или --mount прекрасно, это зависит от ваших личных предпочтений и потребностей.
KillerKode
18

Вы можете использовать -vпараметр несколько раз в docker runкоманде, чтобы смонтировать несколько каталогов в контейнере:

docker run -t -i \
  -v '/on/my/host/test1:/on/the/container/test1' \
  -v '/on/my/host/test2:/on/the/container/test2' \
  ubuntu /bin/bash
Гаурав Сегал
источник
1
Это добавляет что-нибудь к предыдущему ответу к тому же самому эффекту ?
Чарльз Даффи
6

Вы можете иметь только чтение или чтение и запись только на томе

docker -v /on/my/host/1:/on/the/container/1:ro \

docker -v /on/my/host/2:/on/the/container/2:rw \
сентил сивасами
источник
1
какой вариант по умолчанию?
Хаммад Дар
-9

Или вы можете сделать

docker run -v /var/volume1 -v /var/volume2 DATA busybox true
Йост ван дер Лаан
источник
4
Это не то, что после ОП. Это создает том внутри контейнера и не привязывает его на хосте.
Иоаннис
8
Вы правы, должно быть: docker run -v / var / volume1: / container / volume1 -v / var / volume2: / container / volume2 DATA busybox true
Joost van der Laan